javascript - 在构造函数 : Why use the prototype keyword? 上创建公共(public)方法

标签 javascript oop inheritance prototype

如果我创建一个构造函数 BlahWidget 并为其提供 2 个公共(public)方法:publicHello 和 secondHello。我使用“this”直接在小部件内部分配 publicHello,但使用原型(prototype)对象分配 secondHello 方法,这对小部件上 2 种方法的行为有什么真正的区别?

var BlahWidget = function(){
  this.publicHello = function(){
    alert("Hello");
  }
};

BlahWidget.prototype.secondHello = function(){
  alert("Second Hello");
}

我的理解是使用 .prototype 允许它被继承的对象调用。但事实并非如此。这两个方法都可以被继承的函数对象调用,如下所示:

var MiniBlah = function(){

  this.callSupers = function(){
     this.publicHello();    
     this.secondHello();
  }
}


MiniBlah.prototype = new BlahWidget();
MiniBlah.prototype.constructor = MiniBlah;

var x = new MiniBlah();
x.callSupers();//calls both publicHello and secondHello

最佳答案

不同之处在于,在原型(prototype)对象上声明的函数在构造函数创建的对象实例之间共享,而在构造函数主体内部声明的函数则不然,它们属于从函数构造的对象。

这实际上意味着您可以从构造函数创建大量对象,原型(prototype)上的函数执行 X,然后将原型(prototype)上的函数更改为执行 Y,所有对象实例都将获得新功能函数。

一个例子

var BlahWidget = function(){
  this.publicHello = function(){
    console.log("Hello");
  }
};

BlahWidget.prototype.secondHello = function(){
  console.log("Second Hello");
}

var blah1 = new BlahWidget();

var blah2 = new BlahWidget();
blah2.publicHello = function() {
    console.log("Goodbye");
}

blah1.secondHello(); // logs SecondHello
blah2.secondHello(); // logs SecondHello

BlahWidget.prototype.secondHello = function(){
  console.log("Second Goodbye");
}

blah1.secondHello(); // logs Second Goodbye
blah2.secondHello(); // logs Second Goodbye

blah1.publicHello(); // logs Hello
blah2.publicHello(); // logs Goodbye

关于javascript - 在构造函数 : Why use the prototype keyword? 上创建公共(public)方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5198846/

相关文章:

javascript - 如何使用构造函数中创建的方法来更新同一构造函数中的另一个变量?

Java:相同的对象,如何避免重复的代码

python:继承类中连续的 __getitem__() 调用?

C++:将类的子项存储在具有其类型的变量中

ios - 用不同类型的兼容类覆盖@IBoutlet 属性

javascript - 暗模式功能,在 init() 中更改 img src 不起作用

javascript - parent 是相对的固定位置

javascript - wdCalendar buddle mousedown 事件

javascript - jQuery中是否有一种方法可以从元素向上遍历dom树并在其父元素之前检查选择器

javascript - 对象的原型(prototype)方法仅返回函数定义,不执行。