JavaScript Object.prototype访问私有值

时间:2012-03-22 19:11:26

标签: javascript design-patterns

我已经读过,使用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的含义。

4 个答案:

答案 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));