Object使用原型函数名称的名称而不是其属性

时间:2012-11-22 22:32:12

标签: javascript

我创建了两个函数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.不能使用。

2 个答案:

答案 0 :(得分:2)

请查看可能的重复What is the reason to use the 'new' keyword at Derived.prototype = new Base以及this answer,了解为什么javascript中没有“类”。

是的,行为是预期的。 B.prototype实例继承的对象b是函数对象A。因此,它确实继承了name property,即字符串"A"

并且,此属性是不可变的(其属性描述符为{configurable: false, enumerable: false, value: "B", writable: false}),因此当您尝试为b.name分配新值时,this will check[[CanPut]]将返回false - 没有任何反应。在严格模式下,将抛出Invalid assignment in strict mode TypeError(demo)。

您只能使用Object.defineProperty覆盖它。


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

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

答案 1 :(得分:0)

如果您希望BA“继承”,请写:

B.prototype = Object.create( A.prototype );