夯实JavaScript基础之prototype, __proto__, instanceof
2018-02-26 14:48
302 查看
function New(f){ return function(){ var o = {'__proto__': f.prototype}; f.apply(o, arguments); return o; } } function Person(name, age){ this.name = name; this.age = age; } var p = New(Person)('xl', 24);
在一段javascript基础学习视频中,老师大胆想象了一下new方法创造实例对象的原理。
其中一个关键点,让对象的__proto__属性指向任何一个构造函数:{'__proto__': f.prototype}
这个我就蛮好奇的,直接这样,然后以下两段都成立了。
p instanceof Person // true p.constructor === Person // true
以上说明,这个隐藏的属性__proto__的指向一旦建立,那么p实例的constructor就自动指向了Person构造器。
但是我还是好奇为什么。
之前我一直以为instanceof 是否成立还和constructor有关系。
而实际上是,{'__proto__': f.prototype}这个直接的导致了constructor关系(上图绿线)的建立。当我试图把constructor的两个关系重新指向时,
p.constructor = {other: 1}; Person.prototype.constructor = {other: 2}; p instanceof Person // true
p仍然是Person的实例,所以instanceof和constructor无关。而当我试图改变Person的prototype的指向之后,终于变了
Person.prototype = {other: 3} p instanceof Person // false
另外我尝试了一下,在改变Person.prototype指向之前,让其他任何函数的prototype都指向Person.prototype,则
function Person2(){} Person2.prototype = Person.prototype p instanceof Person // true p instanceof Person2 // true
p可以是多个构造函数的实例。
试验之后的结论是:
instanceof 与constructor属性无必然关系,只要对象的隐藏属性__proto__指向任何构造器的prototype属性,那么对象都会是该构造器的实例;对象也可以是多个构造器的实例。
修改:
结论改为:
instanceof 与constructor属性无必然关系,只要对象的隐藏属性[b][b]__proto__,或者对象的__proto__的__proto__,或者对象的[b][b][b]__proto__的__proto__[b][b][b][b][b][b]的__proto__..........指向任何构造器的prototype属性[b],那么对象都会是该构造器的实例;对象也可以是多个构造器的实例。[/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b]
相关文章推荐
- JavaScript中__proto__与prototype的关系
- 在 JavaScript 中 prototype 和 __proto__ 有什么区别
- Effective JavaScript Item 30 理解prototype, getPrototypeOf和__proto__的不同
- 你不知道的JavaScript--Item13 理解 prototype, getPrototypeOf 和__proto__
- js中一切皆为对象 JavaScript中__proto__与prototype的关系
- JavaScript中__proto__与prototype的关系深入理解
- JavaScript 隐式原型(_proto_)与显示原型(prototype)
- JS夯实基础:Javascript 变态题解析 (下)
- javascript prototype&_proto_&constructor
- Effective JavaScript Item 30 理解prototype, getPrototypeOf和__proto__的不同
- javascript 对象及原型继承有关的属性:constructor、prototype、isPrototypeOf、instanceof、in 、hasOwnProperty 等等
- 在 JavaScript 中 prototype 和 __proto__ 有什么区别
- JavaScript中__proto__与prototype的关系
- 你不知道的JavaScript--Item13 理解 prototype, getPrototypeOf 和__proto__
- JavaScript中__proto__与prototype的关系
- JavaScript创建对象过程及__proto__和prototype区别
- Javascript中的__proto__、prototype、constructor
- JavaScript _proto_、prototype原型、原型链、constructor构造器、类式继承、原型继承
- Javascript基础——详解prototype
- 面向对象的程序设计(二)理解各种方法和属性typeof、instanceof、constructor、prototype、__proto__、isPrototypeOf、hasOwnProperty