我已经读过,使用Object.prototype
将函数附加到自定义JavaScript对象比this.foo = function()
的“传统”方法更有效。我遇到的问题是范围。我希望这些公共方法能够访问对象的私有变量。我最终做的是:
function Foo(){
var id = 5;
Foo.prototype.bar = function(){
alert(id);
};
}
var x = new Foo();
x.bar();
我在对象定义中嵌套了原型声明。这工作似乎解决了这个问题。有没有理由不这样做?是否有更好或更标准的方法来实现这一目标?
更新
基于我收到的一些回复,我想我需要提一下,我完全清楚JavaScript中没有private
变量的概念。我在这里使用术语private
意味着在当前范围之外无法访问,因为它更容易说和写,我认为任何试图回答这个问题的人都会知道我使用术语private
的含义。
答案 0 :(得分:1)
虽然您的想法有效,但可能无法按预期工作。我相信每次实例化新Foo
时都会覆盖原型。每次创建新的bar()
时,它都可能会更改Foo
的所有实例的Foo
方法。糟糕。
这是一个使用假私有变量的例子,让某人“谎言”他们的真实年龄。
以下是执行此操作的标准方法:
function Person(name, age) {
this._age = age; // this is private by convention only
this.name = name; // this is supposed to be public
}
Person.prototype.sayHiTo = function(person) {
console.log("Hi " + person.name + ", my name is " + this.name);
}
Person.prototype.age = function() {
return this._age - 3;
}
var j = new Person("Jay", 33);
var k = new Person("Kari", 26);
j.sayHiTo(k) // Hi Kari, my name is Jamund
k.age(); // 23
答案 1 :(得分:1)
您可以使用特权方法来访问私有成员。 更多信息:http://javascript.crockford.com/private.html
然而,IMO真的不值得。这很麻烦,它削弱了古典遗产。 为了什么? “屏蔽”用户直接访问您的私人会员? 它是JS,无论如何都有获取它们的来源和手段,它真的不值得努力。强调伪私人成员就足够了。
答案 2 :(得分:0)
JavaScript中没有私有,只是正确地做事
var Foo = {
bar: function () {
console.log(this._id)
},
constructor: function () {
this._id = 5
return this
}
}
var x = Object.create(Foo).constructor()
x.bar()
答案 3 :(得分:0)
在这里如何伪造它。这是动物类
(function(window){
//public variable
Animal.prototype.speed = 3;
//public method
Animal.prototype.run = function(){
//running
}
//private method
//private method
function runFaster(){
//run faster
}
//private var
//private var
var legCount = 4;
}(window));