gpt4 book ai didi

使用prototype属性的javascript继承

转载 作者:行者123 更新时间:2023-11-28 12:35:00 25 4
gpt4 key购买 nike

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

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

这有效,但是当我使用 B 的原型(prototype)属性时,它不再有效( 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(){ ... } } ;

但我认为这肯定比使用原型(prototype)定义它要慢。那么第二种情况我该如何进行继承呢?

谢谢

最佳答案

这是您的代码:

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 行中的函数,然后立即将 B.prototype 设置为第 5 行中的 new A 6(有效地撤消您在第 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 的观点:Stop using the new keyword .

<小时/>

更新:阅读您的评论并更详细地了解您的问题后,我建议您使用我的 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/

关于使用prototype属性的javascript继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18057193/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com