0

在 javascript 中,如果一个对象继承自一个函数,它似乎根本无法使用 name 属性。我已经在 node.js 中对此进行了测试,并且在各种浏览器中可能都是如此。例如:

var A = function() {}
    A.prototype = function() {}

var x = new A()
x.name = "bob"
console.log(x.name) // logs blank

在这种情况下,您不能覆盖对象原型(即__proto__)中给出的属性,这似乎几乎是荒谬的。我要疯了吗?

4

1 回答 1

1

嗯,这不是因为函数,而是因为原型中有一个描述符,该名称带有writable false.Object.getOwnPropertyDescriptor(function(){}, "name").writable === false

如果您正常创建描述的不可写属性,也会发生同样的情况:

function A() {

}

Object.defineProperty( A.prototype, "name", {
    value: ""
});

var a = new A()

a.name
//""
a.name = "bob"
//"bob"
a.name
//""

你需要通过Object.defineProperty来做到这一点:

Object.defineProperty(x, "name", {value: "bob"})
x.name
//"bob"
于 2013-07-23T07:49:06.680 回答