我正在玩javascript原型。我是新手,所以我有一个小问题。
我正在使用此article作为指南。
我已经定义了产品和书籍。 Book.prototype.constructor = Book();
这个的目的是什么?我弄不清楚。我能够成功调用父构造函数和不成功。
Book.prototype = new Product;
Book.prototype.constructor = Book; // What's the purpose of this
这是我的jsFiddle link
答案 0 :(得分:9)
首先,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
答案 1 :(得分:2)
当使用new运算符调用构造函数(它只是一个函数)时,会创建一个新对象,并将构造函数的this关键字设置为对该新对象的引用。构造函数的原型有一个指向函数的构造函数属性。
new now对象的 internal [[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());
答案 2 :(得分:1)
哦,我刚刚在这里根据我的助手意识到了=)。
这不是必须的
Book.prototype.constructor = Book;
无论如何都会调用Book构造函数。但如果Book将来会被扩展,我将无法在没有它的情况下从它的子类中调用它的构造函数。
我说错了吗?如果不正确请。