理清javascript中prototype、__proto__、Object、Function的关系,更好地理解原型继承

本文参考了http://www.blogjava.net/heavensay/archive/2013/10/20/405440.html这篇文章,对其内容作了个简单总结,形成了几条简单的结论,让读者更容易记住prototype、__proto__、Object、Function之间的关系。

结论1:Object.prototype只是一个普通对象,它是js原型链的最顶端。

(typeof Object.prototype) === object;//true
Object.prototype.__proto__=== null;//true
Object.prototype.prototype === undefied;//true

Object.prototype只是一个普通对象(普通对象没有prototype属性,所以值是undefined),Object.prototype是js原型链的最顶端,它的__proto__是null(有__proto__属性,但值是null,因为这是原型链的最顶端)。

结论2:在js中如果A对象是由B函数构造的,那么A.__proto__ === B.prototype。

function Person()
{

}
var obj = {};
alert(obj.__proto__ === Object.prototype);//true
alert(Person.__proto__ === Function.prototype);//true

javascript中对象是由Object创建的,函数是由Function创建的。

结论3:内置的Object是其实也是一个函数对象,它是由Function创建的。

Object.__proto__ === Function.prototype;

结论4:js中每一个对象或函数都有__proto__属性,但是只有函数对象才有prototype属性。

//函数对象
function Person()
{

}

// 普通对象
var obj = {};

obj.__proto__ === Object.prototype;//true
obj.prototype === undefined;//true
Person.__proto__ === Function.prototype;//true
Person.prototype !== undefined;//true

我们知道javascript正是通过prototype实现继承的。如果objA、objB都是由cFunction创建的,那么根据结论2,objA.__proto__
=== objB.__proto__ === cFunction.prototype,也就是说objA和objB对象都继承了cFunction的prototype。原型链是基于__proto__形成的,继承是通过prototype实现的。

结论5:Function.prototype是个特例,它是函数对象,但是没有prototype属性。其他所有函数都有prototype属性。

(typeof Function.prototype) === function;//true
Function.prototype.prototype === undefined;//true

结论6:内置的Function也是一个函数对象,它是通过自己来创建自己的。

(typeof Function.__proto__) === function;//true
Function.__proto__=== Function.prototype;//true

Function这个函数对象,由其自身通过Function函数构造的。

结论7:函数也是对象,因为Function.__proto__指向Object.prototype。

(typeof Function.prototype.__proto__) === object;//true
Function.prototype.__proto__=== Object.prototype;//true

最后提一下:原型链是基于__proto__形成的,继承是通过prototype实现的。

每个对象都有一个__proto__属性,原型链上的对象正是依靠这个__proto__属性连结在一起的!  对于原型链上的一个对象obj,那么访问obj.xxx属性(方法也是属性)的过程是: 如果自身有xxx属性,则访问它;如果没有,就通过__proto__属性找到其原型链的上一级原型对象,看它有没有xxx属性,如此递归查找,直至找到xxx属性或到了原型链顶端Object.prototype对象为止。

函数拥有prototype属性,该属性值是一个object类型。当函数A创建对象B的时候,B对象的__proto__会指向A.prototype,这就是javascript的继承。





时间: 2024-08-03 06:58:58

理清javascript中prototype、__proto__、Object、Function的关系,更好地理解原型继承的相关文章

在 JavaScript 中 prototype 和 __proto__ 有什么区别

本文主要讲三个 问题 prototype 和 proto function 和 object new 到底发生了什么 prototype 和 proto 首先我们说下在 JS 中,常常让我们感到困惑的地方,就是 prototype 和 __proto__ 到底是干嘛的 1. __proto__ 就是 Javascript中 所谓的原型 (这里,我们还是拿具体的例子来说明吧) function A (name) { // 这里是一个构造函数 thia.name = name } var Aobj

JavaScript的数据类型都有什么? JavaScript中 toStirng() 与 Object.prototype.toString().call()

JavaScript的数据类型都有什么? (via  BAT互联网公司2014前端笔试面试题:JavaScript篇  http://www.sxt.cn/u/756/blog/4508) 基本数据类型:String,boolean,Number,Undefined, Null 引用数据类型: Object(Array,Date,RegExp,Function) 疑问:这些基本的数据类型的值都是常量,而常量是没有方法的,为什么能够调用方法呢?答案是这样的,五种基本类型除了null.undefin

javascript中函数调用,函数实例化,函数三者关系

<!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <title>test</title> <script type="text/javascript" ></script> <script type="text/javascript"> // a

node.js javascript理解原型继承

util.inherits util.inherits(constructor, superConstructor)是一个实现对象间原型继承的函数. JavaScript 的面向对象特性是基于原型的,与常见的基于类的不同.JavaScript 没有提供对象继承的语言级别特性,而是通过原型复制来实现的 var util = require('util'); function Base() { this.name = 'base'; this.base = 1991; this.sayHello =

JavaScript中toStirng()与Object.prototype.toString.call()方法浅谈

toStirng()与Object.prototype.toString.call()方法浅谈 一.toString()是一个怎样的方法?它是能将某一个值转化为字符串的方法.然而它是如何将一个值从一种类型转化为字符串类型的呢? 通过下面几个例子,我们便能获得答案: 1.将boolean类型的值转化为string类型: console.log(true.toString());//"true" console.log(false.toString());//"false&quo

Javascript中prototype属性的详解

原文链接:http://www.cnblogs.com/Uncle-Keith/p/5834289.html 在典型的面向对象的语言中,如java,都存在类(class)的概念,类就是对象的模板,对象就是类的实例.但是在Javascript语言体系中,是不存在类(Class)的概念的,javascript中不是基于‘类的’,而是通过构造函数(constructor)和原型链(prototype chains)实现的.但是在ES6中提供了更接近传统语言的写法,引入了Class(类)这个概念,作为对

【jquery】javaScript中prototype的妙用 巧妙运用prototype属性原型链创建对象

prototype  可以有好多有优化实现方法 http://blog.csdn.net/liuqiwen0512/article/details/8089690 在 JavaScript 中,每个函数对象都有一个默认的属性 prototype,称为函数对象的原型成员,这个属性指向一个对象,称为函数的原型对象,当我们每定义了一个函数的时候,JavaScript 就创建了一个对应的原型对象,也就是说,当我们定义一个函数的时候,实际上得到了两个对象,一个函数对象,一个原型对象.原型对象是一个特殊的对

一篇关于JavaScript中prototype的文章

一.简述 没什么可说的,直接上代码. 二.内容 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title&

Javascript中prototype属性

prototype作为JS相对比较难理解的一个知识点,在这里发表下自己的理解. 本文将包含以下几部分内容: 1.js prototype的简单介绍, 2.js构造函数的介绍, 3.prototype的深入理解, 4.constructor. 一.在其他的面向对象语音中,比如Java,存在类(class)的概念,对象就是类的实例.但是再js当中呢,是没有类的概念的,平常时说的加一个class类是指在样式css中加一个类class.js中一切皆对象,所有的东西都是对象(除了null和undefine