0

我正在尝试在javascript中进行继承。首先,在网上我发现了这个

function A() {}
function B(){}
B.prototype = new A() ;
B.prototype.constructor = B ;

这可行,但是当我使用 B 的原型属性时,它不再起作用(http://jsfiddle.net/jeanluca/eQBUx/

function A() {}
A.prototype.bar = function(){ return 'A'; }

function B() {}
B.prototype.bar = function(){ return 'B'; }

我意识到你可以做到

function B(){ this.bar = function(){ ... } } ;

但我认为这肯定比使用原型定义它要慢。那么在第二种情况下我怎么能继承呢?

谢谢

4

3 回答 3

2

您正在原型对象上创建一个属性,之后您将完全替换它。反过来做,在对象上创建bar方法。并且不要使用new

function B() {}
// first create the prototype object
B.prototype = Object.create(A.prototype);
// then assign properties on it
B.prototype.bar = function(){ return 'B'; }
于 2013-08-05T11:43:29.723 回答
2

这是你的代码:

function A() {}
A.prototype.bar = function(){ return 'A';}

function B() {}
B.prototype.bar = function(){ return 'B'; }
B.prototype = new A() ; // replaces B's "bar" with A's "bar

var b = new B ;
console.log(b.bar());

如您所见,问题出在第 6 行。您首先B.prototype.bar在第 5 行设置了一个函数,然后您立即在第 6 行设置B.prototypenew A(有效地撤消了您在第 5 行中所做的操作)。解决方案是将第 6 行放在第 5 行之前:

function A() {}
A.prototype.bar = function(){ return 'A';}

function B() {}
B.prototype = new A() ; // now it will work
B.prototype.bar = function(){ return 'B'; }

var b = new B ;
console.log(b.bar());

亲自查看演示:http: //jsfiddle.net/eQBUx/1/

另外我同意Bergi:停止使用new关键字


更新:阅读您的评论并更详细地了解您的问题后,我建议您使用我的augment库进行继承:

var A = Object.augment(function () {
    this.constructor = function () {};

    this.bar = function () {
        return "A";
    };
});

var B = A.augment(function (base) {
    this.constructor = function () {};

    this.bar = function () {
        return "B" + base.bar.call(this);
    };
});

var b = new B;

console.log(b.bar());

查看演示:http: //jsfiddle.net/eQBUx/2/

于 2013-08-05T11:58:32.850 回答
2

使用this分配属性会破坏原型链。这是非常低效的,你不能用它来获得继承。所以..不要?

于 2013-08-05T11:40:09.103 回答