为什么在使用之前访问Object.defineProperty定义的属性的行为会发生变化?

时间:2013-02-22 13:58:26

标签: javascript properties defineproperty

仅在Chrome中对此进行了测试,我的应用程序无需在任何其他浏览器中使用。

例如,在以下代码(JSFiddle)中:

function A(a) {
    document.write(this.B);
    this.A = a;
    this.B = a;
}
function A_C(a) {
    this.A = a;
    this.B = a;
}
A.prototype.constructor = A;
A.prototype.C = A_C;
Object.defineProperty(A.prototype, 'B', {
    writeable: true,
    enumerable: true,
    value: '0'
});

var B = A;

var C = new A('A');
var D = new B('B');

document.write(C.A);
document.write(D.A);
document.write(C.B);
document.write(D.B);

C.C('C');
D.C('D');

document.write(C.A);
document.write(D.A);
document.write(C.B);
document.write(D.B);

输出结果为:

00AB00CD00

而不是:

00ABABCDCD

而在以下代码(JSFiddle)中:

function A(a) {
    this.A = a;
    this.B = a;
}
function A_C(a) {
    this.A = a;
    this.B = a;
}
A.prototype.constructor = A;
A.prototype.C = A_C;
Object.defineProperty(A.prototype, 'B', {
    writeable: true,
    enumerable: true,
    value: '0'
});

var B = A;

var C = new A('A');
var D = new B('B');

document.write(C.A);
document.write(D.A);
document.write(C.B);
document.write(D.B);

C.C('C');
D.C('D');

document.write(C.A);
document.write(D.A);
document.write(C.B);
document.write(D.B);

输出结果为:

ABABCDCD

这里发生了什么?

1 个答案:

答案 0 :(得分:1)

您错误输入了writable

writable: true

按预期工作。 Fiddle

默认情况下,

writablefalse,因此如果名称错误,则仍为false


如何设置不可写属性并且它覆盖/隐藏原型没有任何意义,它看起来像Chrome实现中的错误。这种错误的行为在Firefox中是不可重现的。