繁体   English   中英

原型链,构造函数,继承

[英]Prototype chaining, Constructor, Inheritance

我正在玩javascript原型。 我是新手,所以我有一个小问题。

我正在使用这篇文章作为指南。

我已经定义了一个产品并定义了一本书。 Book.prototype.constructor = Book();的目的是什么Book.prototype.constructor = Book(); 这个。 我弄不清楚。 我能够成功调用父构造函数和不使用它。

Book.prototype = new Product;
Book.prototype.constructor = Book; // What's the purpose of this

这是我的jsFiddle 链接

首先, 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM