我们应该使用 javascript 继承的哪些变体,为什么?
Which variants of javascript inheritance we should use and why?
我不明白我们应该使用哪些继承变体。我什至不知道它们之间有没有区别
我有一个简单的 JavaScript 继承示例:
function MyObject(a){
this.a = a;
}
function MyObjectChild(a, b){
MyObject.call(this, a);
this.b = b;
}
MyObjectChild.prototype = Object.create(MyObject.prototype);
var myObj = new MyObjectChild(1, 2);
console.log(myObj.a + " " + myObj.b);
结果将为“1 2”。
但是这一行:
MyObjectChild.prototype = Object.create(MyObject.prototype);
我们可以用 10 种不同的方式来写:
MyObjectChild.prototype = new MyObject();
MyObjectChild.prototype = MyObject.prototype;
MyObjectChild.prototype = MyObject.prototype.prototype;
MyObjectChild.prototype = Object.create(MyObject);
MyObjectChild.prototype = Object.create(MyObject.prototype);
MyObjectChild.prototype.prototype = new MyObject();
MyObjectChild.prototype.prototype = MyObject.prototype;
MyObjectChild.prototype.prototype = MyObject.prototype.prototype;
MyObjectChild.prototype.prototype = Object.create(MyObject);
MyObjectChild.prototype.prototype = Object.create(MyObject.prototype);
所有这些都会起作用!谁能解释一下我们应该使用哪些变体,哪些不应该使用?
你可以用一百万种不同的方式来写它,因为在这种情况下它什么都不做。
试试你的代码
MyObjectChild.prototype = Object.create(MyObject.prototype);
它仍然有效。
在 MyObject.call(this, a);
行中,您将 MyObject 作为函数调用,并赋予它与 MyObjectChild
构造函数中相同的 this
引用。因此,您在创建 myObj
对象时直接将 a
和 b
的值添加到 MyObjectChild
对象。
回答您的问题:两者都不应该使用。
但是,在您的示例中,您可以像这样达到预期的效果...
function MyObject(a){
this.a = a;
}
MyObject.prototype.foo = "ta da";
function MyObjectChild(a, b){
MyObject.call(this, a);
this.b = b;
}
MyObjectChild.prototype = Object.create(MyObject.prototype);
var myObj = new MyObjectChild(1, 2);
console.log(myObj.foo); // ta da
这样,使用这些构造函数创建的所有实例(例如 myObj
)都将从 MyObject.prototype
.
继承属性
编辑:
最初建议使用 MyObjectChild.prototype = MyObject.prototype;
。这意味着所有实例都从同一个原型对象继承属性。
感谢下面的 Bergi 指出这可能不是您想要的,因为向 MyObjectChild
的原型添加属性然后会被 [=23= 继承].
Object.create(MyObject.prototype)
创建了一个新对象(您可以向其添加仅 MyObjectChild
实例继承的属性),同时仍然从 MyObject
的原型继承属性。
我不明白我们应该使用哪些继承变体。我什至不知道它们之间有没有区别
我有一个简单的 JavaScript 继承示例:
function MyObject(a){
this.a = a;
}
function MyObjectChild(a, b){
MyObject.call(this, a);
this.b = b;
}
MyObjectChild.prototype = Object.create(MyObject.prototype);
var myObj = new MyObjectChild(1, 2);
console.log(myObj.a + " " + myObj.b);
结果将为“1 2”。
但是这一行:
MyObjectChild.prototype = Object.create(MyObject.prototype);
我们可以用 10 种不同的方式来写:
MyObjectChild.prototype = new MyObject();
MyObjectChild.prototype = MyObject.prototype;
MyObjectChild.prototype = MyObject.prototype.prototype;
MyObjectChild.prototype = Object.create(MyObject);
MyObjectChild.prototype = Object.create(MyObject.prototype);
MyObjectChild.prototype.prototype = new MyObject();
MyObjectChild.prototype.prototype = MyObject.prototype;
MyObjectChild.prototype.prototype = MyObject.prototype.prototype;
MyObjectChild.prototype.prototype = Object.create(MyObject);
MyObjectChild.prototype.prototype = Object.create(MyObject.prototype);
所有这些都会起作用!谁能解释一下我们应该使用哪些变体,哪些不应该使用?
你可以用一百万种不同的方式来写它,因为在这种情况下它什么都不做。
试试你的代码
MyObjectChild.prototype = Object.create(MyObject.prototype);
它仍然有效。
在 MyObject.call(this, a);
行中,您将 MyObject 作为函数调用,并赋予它与 MyObjectChild
构造函数中相同的 this
引用。因此,您在创建 myObj
对象时直接将 a
和 b
的值添加到 MyObjectChild
对象。
回答您的问题:两者都不应该使用。
但是,在您的示例中,您可以像这样达到预期的效果...
function MyObject(a){
this.a = a;
}
MyObject.prototype.foo = "ta da";
function MyObjectChild(a, b){
MyObject.call(this, a);
this.b = b;
}
MyObjectChild.prototype = Object.create(MyObject.prototype);
var myObj = new MyObjectChild(1, 2);
console.log(myObj.foo); // ta da
这样,使用这些构造函数创建的所有实例(例如 myObj
)都将从 MyObject.prototype
.
编辑:
最初建议使用 MyObjectChild.prototype = MyObject.prototype;
。这意味着所有实例都从同一个原型对象继承属性。
感谢下面的 Bergi 指出这可能不是您想要的,因为向 MyObjectChild
的原型添加属性然后会被 [=23= 继承].
Object.create(MyObject.prototype)
创建了一个新对象(您可以向其添加仅 MyObjectChild
实例继承的属性),同时仍然从 MyObject
的原型继承属性。