仅在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
这里发生了什么?
答案 0 :(得分:1)
您错误输入了writable
:
writable: true
按预期工作。 Fiddle
默认情况下, writable
为false
,因此如果名称错误,则仍为false
。
如何设置不可写属性并且它覆盖/隐藏原型没有任何意义,它看起来像Chrome实现中的错误。这种错误的行为在Firefox中是不可重现的。