我读了一篇关于在类层次结构中保持数据私有化的文章这里。我的做法不同。我使用工厂函数并使用Object.setPrototypeOf(obj, prototype)。为什么我的方法不被视为良好的实践?
这是我的做法:
我不想使用公共变量,因此我使用工厂函数创建我的狗对象:
请注意,
但是class关键字似乎会在我的对象上产生公共变量。如果我尝试使用这些之类的技巧,它看起来有点丑(我想下划线语法看起来还不错,但它并不是真正的私有)。
更新:相反,您可以将所有内容放在新创建的对象上。
这比尝试在Javascript中实现OOP要干净得多。
这是我的做法:
我不想使用公共变量,因此我使用工厂函数创建我的狗对象:
const makeDog = (name) => {
return { bark: () => { console.log(name) } }
}
const myDog = makeDog("sniffles")
myDog.bark() // "sniffles"
所有的动物都能进食,我希望我的狗能从动物那里继承这一特点:
const makeAnimal = () => {
let numTimesEat = 0
return {
eat: (food) => {
numTimesEat += 1
console.log( "I eat " + food.toString() )
},
get numTimesEat() { return numTimesEat }
}
}
const myAnimal = makeAnimal()
我的狗将会委托给我的动物来进行吃饭:
Object.setPrototypeOf(myDog, myAnimal)
现在我可以做:
myDog.eat("shoe") // "I eat shoe"
console.log( myDog.numTimesEat ) // 1
myDog.bark() // "sniffles"
请注意,
myDog.numTimesEat
应该指的是myDog吃饭的次数。
附言:我知道你可以使用类来实现它:
class Animal {
constructor() {
this.numTimesEat = 0;
}
eat(food) {
this.numTimesEat += 1;
console.log( "I eat " + food.toString() );
}
}
class Dog extends Animal {
constructor(myName) {
super();
this.name = myName;
}
bark() {
console.log( this.name );
}
}
const dog2 = new Dog("sniffles");
dog2.eat("shoe"); // "I eat shoe"
console.log( dog2.numTimesEat ); // 1
console.log( dog2.name ); // "sniffles"
dog2.bark(); // "sniffles"
但是class关键字似乎会在我的对象上产生公共变量。如果我尝试使用这些之类的技巧,它看起来有点丑(我想下划线语法看起来还不错,但它并不是真正的私有)。
解决方案:
如果我们创建10只狗,它们的原型都是同一个动物,那么“let numTimesEat”就是共享的。如果一只狗吃了一次,你不希望numTimesEat变成10。
因此,除了重复设置原型10次(这是一个缓慢的操作),你还需要为这10只狗创建10个动物来委托。
更新:相反,您可以将所有内容放在新创建的对象上。
const Dog = function(name) {
let that = Animal()
that.bark = () => { console.log(name) }
return that
}
const Animal = function() {
let numTimesEat = 0
return {
eat: (food) => {
numTimesEat += 1
console.log( "I eat " + food.toString() )
},
get numTimesEat() { return numTimesEat }
}
}
const lab = new Dog("sniffles")
lab.bark() // sniffles
lab.eat("food") // I eat food
lab.numTimesEat // 1
这比尝试在Javascript中实现OOP要干净得多。
Object.setPrototypeOf()
在 JavaScript 中使用该问题。 “这个问题不是为什么修改对象的 [[prototype]] 对性能有害的重复,因为问题不仅仅在于性能。” 问题中没有出现任何性能指标。与哪些比较有关的性能?您正在比较哪些基准测试?从这里的角度来看,问题陈述不够清晰。 - guest271314