乐趣区

关于javascript:分析prototypeprotoObjectFunction的关系理解原型继承

论断 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.prototype__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 的继承。

本文参考了 https://blog.csdn.net/weixin_40191445/article/details/83477219 这篇文章,对其内容进行转载,不便记忆学习。

退出移动版