4

我创建了两个函数 A 和 B。将 A 作为B.jsfiddle的原型

function A(){

}

function  B(){
    this.name ="Class B";
}

B.prototype = A;
var b = new B();
alert(b.name); // expected Class B got A

我知道我应该使用B.prototype = new A();

上述行为是预期的吗?在上述情况下是否有可能获得“B 类”而不是“A”?

注意:我在上面使用是因为 A 有一些与之关联的属性,A.text = "Text" A.text1 = "Text2"并且我希望这些属性对 B 可用。所以B.prototype == A.prototype.不能使用。

4

2 回答 2

2

看看可能的重复What is the reason to use the 'new' keyword at Derived.prototype = new Base以及这个关于为什么 javascript 中没有“类”的答案。

是的,这种行为是预期的。B.prototype,您的b实例继承的对象,是函数对象A。所以,它确实继承了它的name属性,即 string "A"

而且,这个属性是不可变的(它的属性描述符是{configurable: false, enumerable: false, value: "B", writable: false}),所以当你尝试为 分配一个新值时b.name这将检查[[CanPut]]哪个返回false- 并且没有任何反应。在严格模式下,Invalid assignment in strict mode会抛出 TypeError ( demo )。

您只能使用Object.defineProperty.


@Edit:我不确定您为什么希望这些属性由B. 它们是A构造函数的“静态属性”,它们应该留在那里。目前没有办法让 Function 继承自 之外的任何东西Function.prototype,所以要么复制它们,要么不使用它们。告诉我们您需要什么,我们可以找到解决方案。

更改prototype函数(以及一般对象)的属性不会使它们碰巧继承自其他任何东西。函数的prototype属性指向新创建(构造)实例将继承的对象。

于 2012-11-22T22:37:40.133 回答
0

如果你想B从 中“继承” A,请写:

B.prototype = Object.create( A.prototype );
于 2012-11-22T22:36:38.873 回答