请考虑以下内容:
var o = {foo: 'bar'};
var p = Object.create(o);
如果
o
是p
的原型(prototype),那么相对于o
,p
是什么?请考虑以下内容:
var o = {foo: 'bar'};
var p = Object.create(o);
o
是p
的原型(prototype),那么相对于o
,p
是什么?我不知道是否有关于继承自另一个对象原型的对象的正式术语达成普遍共识,但我认为“派生对象”这个术语是可以接受的。
原型继承的重点在于一个对象是从另一个对象继承而来的,或者说派生自另一个对象。在一些传统的面向对象编程语言中,例如C++,你会听到“派生类”这个术语,因为类是从其他类继承而来的。由于继承是在原型语言中两个对象之间进行的,因此我认为“派生对象”这个术语是合理的。
new
比Object.create
更好。不过,Object.create
确实表示“像这个现有对象一样创建一个新对象”。 - Ray Toal__proto__
或Object.getPrototypeOf(instance)
(proto不是标准,如果可用,则最好使用Object.getPrototypeOf)访问原型。function objCreate(prototypeObject){
var constructor = function(){};
constructor.prototype = prototypeObject;
return new constructor;
}
所以在以下情况下:
var o = {foo: 'bar'};
var p = objCreate(o);
o被分配给p的构造函数的原型属性。
现在看看这个:
alert(p.foo);//'bar'
p.constructor.prototype = { foo: 'foobiedoobie', bar: 'ubarfu' }
alert(p.foo);//'foobiedoobie' // and we could access bar if we wanted to
在 o 的原型链下面会有 p,而在 p 的原型链上面会有 o。当某个成员无法直接在实例中找到时,原型链就会被使用。JavaScript 只会沿着原型链向上查找,直到找到该成员或返回 undefined:https://dev59.com/J2Qo5IYBdhLWcg3wbe5K#16063711
var o = {o:22}
var p = Object.create(o);
p.p = 33;
var q = Object.create(p);
console.log(q);
console.log(q.__proto__);
console.log(q.__proto__.__proto__);
p instanceof o
会抛出TypeError。 - user2864740p instanceof o
是一个TypeError
。 - Amadan