gpt4 book ai didi

javascript - 闭包和多实例

转载 作者:行者123 更新时间:2023-11-29 10:44:11 25 4
gpt4 key购买 nike

我喜欢闭包,因为您可以从中创建一个 API,但不能拥有多个实例很糟糕。

http://jsfiddle.net/LxCJe/1/

var Person = (function () {

// private properties and methods
var Constr, name;

// public API
Constr = function (n) {
name = n;
};

Constr.prototype.sayName = function(){return name;};

return Constr;
}());


var person1 = new Person('Foo');
var person2 = new Person('Bar'); //New values will overwrite the name because of the closure.

console.log(person1.sayName()); //Bar
console.log(person2.sayName()); //Bar

是否有其他方法能够使用原型(prototype)来访问私有(private)成员并创建不同的实例?

最佳答案

如果你真的想使用构造函数和私有(private)成员,那么你可以这样做

var Person = function(my_name) {

// private properties and methods
var Constr, name;

// public API
Constr = function(n) {
name = n;
};

Constr.prototype.sayName = function() {
return name;
};

return new Constr(my_name);
};

注意:

  1. 但这并不高效,因为我们必须在每次创建 Person 对象时创建 Constr 构造函数。

  2. 它使得从 Constr/Person 继承成为不可能,因为 Constr 不能从外部访问,而且 的原型(prototype)人是空的。

    console.log(Person.prototype); // {}

我认为,并非所有变量在您的类中都是私有(private)的。所以,你可以像这样拥有私有(private)成员

var Person = function(my_name) {

// private properties and methods
var name = my_name;

// public API
this.getName = function() {
return name;
}

this.setName = function(newName) {
name = newName;
}
};

Person.prototype.printName = function() {
console.log(this.getName());
}

var person1 = new Person('Foo');
var person2 = new Person('Bar');

console.log(person1.getName()); // Foo
console.log(person2.getName()); // Bar
console.log(Person.prototype); // { printName: [Function] }
person1.printName();
person2.printName();

关于javascript - 闭包和多实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22702949/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com