我对使用object.create实现原型继承相对于经典的js方式还比较陌生。
至少在Chrome浏览器中,我惊奇地发现以下代码:
var baseObject = {
test : function(){
console.log('Child');
}
}
var newObject = Object.create(baseObject);
newObject.test = function(){
console.log('Parent');
this.__proto__.test();
}
console.log(newObject);
newObject.test();
生成这个(模拟Web工具中的输出):
Object {test: function, test: function}
test: function (){
__proto__: Object
test: function (){
__proto__: Object
Parent
Child
因此你可以看到,它不是设置原型而是仅使用“__proto__”,我认为这种做法是不鼓励的。从我的代码中可以看出,我能够正确继承并调用父对象,但只能使用“__proto__”。使用“prototype”会导致错误(未定义)。
这里发生了什么?我认为对象的创建会设置“prototype”,因为这是标准(或者我曾经这样认为)。为什么它填充并让我使用“__proto__”?
__proto__
允许你给一个已存在的对象设置新的原型链。构造函数和Object.create
只能在对象创建时设置它。从那时起,它就是永久的。事实上,如果你从构造函数创建一个对象,然后给构造函数一个新的.prototype
对象,那么你已经创建的对象仍然引用原始的对象。它永远不会改变。 - the systemObject.create()
是一种更直接创建该链接的方法。Object.getPrototypeOf()
允许您获取链中的下一个对象,而__proto__
则允许您获取或替换它。 - the system