【问题标题】:JavaScript Prototype property stealing / inheritanceJavaScript Prototype 属性窃取/继承
【发布时间】:2017-09-11 19:32:10
【问题描述】:

这是进行原型继承和属性“窃取??”/继承的正确方法。 我想从 Person 构造函数中继承所有属性 + 所有方法。

function Product(name, price) {
    this.name = name;
    this.price = price;
}
Product.prototype.tellMe = function() {
    console.log('Name = ' + this.name + ', Price = ' + this.price);
}

function Food(name, price, category) {
    Product.call(this, name, price);
    this.category = category;
}
Food.prototype = Object.create(Product.prototype);
Food.prototype.constructor = Food;

var b = new Food('Name', 123, 'Category');
console.log(b);
b.tellMe();
var a = new Product('Name2', 321);
console.log(a);

如果你能给我一个很好的例子,我将不胜感激。 谢谢!

【问题讨论】:

    标签: javascript oop


    【解决方案1】:

    是的,这是使用构造函数/原型(又名伪经典)模式的正确方法。

    通过重新分配Food.prototype 以引用从Product.prototype 继承的对象,您可以访问其中为Food 的所有实例定义的所有方法。通过调用Product.call(this, name, price),您可以在新创建的对象中添加nameprice 属性。

    不同之处在于属性将是 Food 对象的“自己的”属性(例如,它们实际上将位于 b 对象内部),而方法可通过原型委托。也就是说,Food 的实例会将方法调用委托给它们的原型 Food.prototype,而后者又会将调用委托给它的原型 Product.prototype

    简单来说,JS 会在b 中搜索tellMe,由于在其中找不到它,它会在其原型Food.prototype 中搜索它。它也不在那里,所以它向上移动到它的原型Product.prototype,在那里它最终找到了那个方法并执行它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-08-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-03
      相关资源
      最近更新 更多