javascript - 构造函数继承;我没有得到什么?

标签 javascript oop inheritance

我试图理解 Javascript 中的继承,但这段代码(在 Firebug 中测试过)并不像我期望的那样工作。我有什么不明白的?

var A = function(v){
  this.v = v || 'foo';
}

A.prototype.shout = function(){ alert(this.v); }

var B = function(){};

B.prototype = new A;

var test = new B('bar')
test.shout() // returns 'foo'

我期望的是,当我分配 test 时,属性 this.v 被设置为“bar”。据我了解,将 B 的原型(prototype)设置为 A 的 JS 原型(prototype)继承意味着 B 中的所有内容都将被覆盖。我希望它的构造函数被覆盖,并且调用 new B('bar') 将使用参数“bar”执行 A 的构造函数。

如果我的理解有误,请大家指正。找到我想要做的事情的解决方案也很好:

// constructors from above
B.prototype.yell = function(){ alert('hello world'); }
var test1 = new B('bar'), test2 = new B('spam'), test3 = new B('eggs');

...因此我正在创建的 JS 对象遵循与标准 OOP 类似的继承模式,因此 B 将继承 A 的构造函数和方法。

编辑:

阅读评论后,我相信一个更好的问题是问如何用 A 的构造函数覆盖 B 的构造函数?

最佳答案

下面是一个构造函数。它在您调用新 A 时运行。

var A = function(v){
  this.v = v || 'foo';
}

在B构造函数中是function(){};所以你没有设置 this.v

要获得您正在尝试的结果,您应该遵循以下模式:

var A = function(v){
  this.v = v || 'foo';
}

A.prototype.shout = function(){ alert(this.v); }

var B = function(v){
    B.prototype.constructor.call(this,v); // here you call A constructor 
};

B.prototype = new A;


var test = new B('bar')
test.shout() // returns 'bar

关于javascript - 构造函数继承;我没有得到什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1271508/

相关文章:

php - 保护独立变量

inheritance - Haxe 反射 - 子类和接口(interface)

java - 子类和父类(super class)的混淆

java - 3 个支票账户 2 个 build 者为客户提供没有 overdraw 的服务,但是不想 overdraw 的客户可以得到一个

javascript - jQuery post() 和读取 cookie

javascript - 将 div 从一个类包装到另一个类

javascript - 第二个 jQuery 按钮单击未触发

javascript - 隐藏/显示具有特定类的表行,直到具有不同类名的另一行?

Java,数据库——既然我们可以直接将它放入数据库,为什么还要分配一个新对象

php - 如何使用不限于类范围的全局类?