[英]Prototype chaining, Constructor, Inheritance
首先, new Product()
创建一个包含Product函数的所有原型变量的对象。 因此,通过设置Book.prototype = new Product()
,Book继承了Product的所有原型变量。
您可能认为您也可以说: Book.prototype = Product.prototype
,但该解决方案无法按预期工作。 Book的原型成为Product的原型指针,因此它不是副本。 如果你想改变Book的原型,它实际上是在Product的原型中改变的,那不是你想要的。
不久, new Product()
创建了所有原型变量的副本。
但这种方法也存在问题。 如果要立即创建新Book,则调用Product构造函数,而不是Book构造函数。 要解决这个问题,你需要再次正确设置构造函数,它将工作:
Book.prototype.constructor = Book;
// Note: it's not Book(), but Book, it's a reference to the function
当使用new运算符调用构造函数(它只是一个函数)时,会创建一个新对象,并将构造函数的this关键字设置为对该新对象的引用。 构造函数的原型具有指向函数的构造函数属性。
new now对象的内部 [[prototype]]属性指向构造函数的公共原型。 对象不会从他们自己的公共原型继承。
在你的代码中:
function Product(dName) {
this.displayName = dName;
}
function Book(dName, isbn) {
//Properties
this.ISBN = "";
// Constructor
Product.call(this, dName);
this.ISBN = isbn;
// Methods
this.getName = function() {
return this.displayName + ': ' + this.ISBN;
};
}
Book.prototype = new Product();
这将Book的原型设置为Product的新实例(即Product.prototype作为其内部[[prototype]]的对象)。
Book.prototype.constructor = Book(); // What's the purpose of this
您应该分配一个引用,而不是调用Book,所以删除()。
Book的实例从Book.prototype继承其构造函数属性。 但由于它是Product的一个实例,它继承了Product.prototype的构造函数,因此引用了Product。 删除()以便Book.prototype.constructor引用Book。 现在Book的实例将具有从Book.prototype继承的构造函数属性,该属性引用Book。
它是一个非常无用的属性,因为它可以很容易地被覆盖,因此使用构造函数属性来确定某个对象是否是某个实例并不常见。 instanceOf运算符也存在缺陷,但使用它们的原因并不多。
var b = new Book("Book", "993438403994");
alert(b.getName());
哦,我刚刚在这里根据我的助手实现了=)。
这不是必须的
Book.prototype.constructor = Book;
无论如何都会调用Book构造函数。 但如果Book将来会被扩展,我将无法在没有它的情况下从它的子类中调用它的构造函数。
我对么? 如果不正确请。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.