作者mrbigmouth (大嘴先生)
看板Ajax
标题Re: [问题] ES2015的class问题
时间Fri Oct 30 10:07:20 2015
自问自答,
现在暂时使用getter/setter + scope变数来实作
「可在所有实例间分享」、「可继承」的资料属性。
"use strict";
let someHash = {
a:1,
b:2
};
class A {
get someHash() {
return someHash;
}
set someHash(value) {
someHash = value;
}
}
const a = new A();
const b = new A();
a.someHash.a = 2;
console.log(b.someHash.a); //2
但这样的做法会让对实例或者继承者实例覆写属性时也盖掉所有实例的属性
a.someHash = {
c: 3
};
console.log(b.someHash.a); //undefined
要防止这点只要不设setter(让尝试写入时出错)或让setter时不改变someHash即可,
要完整实作旧版prototype的机制大概得动用__伪private属性
let someHash = {
a:1,
b:2
};
class A {
get someHash() {
return this.__someHash || someHash;
}
set someHash(value) {
this.__someHash = value;
}
}
const a = new A();
const b = new A();
a.someHash.a = 2;
console.log(b.someHash.a); //2
a.someHash = {
c: 3
};
console.log(a.someHash.a); //undefined
console.log(a.someHash.c); //3
console.log(b.someHash.a); //2
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 211.75.132.13
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/Ajax/M.1446170843.A.DC8.html
1F:→ bibo9901: 干嘛不直接放在prototype上就好 10/30 11:52
2F:→ mrbigmouth: 我上篇有说啊 node.js下的class没有prototype让你改 10/30 11:57
3F:→ mrbigmouth: 是babel编译时用prototype实作你才能改 10/30 11:58
4F:→ mrbigmouth: 啊 我错了 原来只是不能直接设定 但是可以加属性 10/30 17:29