如何在原型函数中访问javascript对象变量

时间:2011-07-22 01:58:47

标签: javascript

我有以下javascript

function person() {
  //private Variable
  var fName = null;
  var lName = null;

  // assign value to private variable
  fName = "Dave";
  lName = "Smith";
};

person.prototype.fullName = function () {
  return this.fName + " " + this.lName;
};

var myPerson = new person();
alert(myPerson.fullName());

我试图在javascript中理解面向对象的技术。我有一个简单的人物对象,并为其原型添加了一个函数。

我期待警报有“Dave Smith”,但我得到了"underfined underfined"。为什么这样,我该如何解决?

4 个答案:

答案 0 :(得分:10)

很遗憾,您无法访问私有变量。因此,要么将其更改为公共属性,要么添加getter / setter方法。

function person() {

    //private Variable
    var fName = null;
    var lName = null;

    // assign value to private variable
    fName = "Dave";
    lName = "Smith";

    this.setFName = function(value){ fName = value; };
    this.getFName = function(){ return fName; }
};

请参阅javascript - accessing private member variables from prototype-defined functions


但实际上这看起来像你在寻找: Javascript private member on prototype

来自那篇SO帖子:

  

由于JavaScript是词法范围的,您可以在每个对象级别上使用构造函数作为对“私有成员”的闭包并在构造函数中定义方法来模拟这个,但这不适用于定义的方法在构造函数的prototype属性中。

在你的情况下:

var Person = (function() {
    var store = {}, guid = 0;

    function Person () {
        this.__guid = ++guid;
        store[guid] = { 
            fName: "Dave",
            lName: "Smith"
        };
    }

    Person.prototype.fullName = function() {
        var privates = store[this.__guid];
        return privates.fName + " " + privates.lName;
    };

    Person.prototype.destroy = function() {
        delete store[this.__guid];
    };

    return Person; 
})();


var myPerson = new Person();

alert(myPerson.fullName());

// in the end, destroy the instance to avoid a memory leak
myPerson.destroy();

查看http://jsfiddle.net/roberkules/xurHU/

上的实时演示

答案 1 :(得分:5)

当您将人员称为构造函数时,会创建一个新对象,就像new Object()一样,并将其分配给关键字。默认情况下,该对象将从构造函数返回。

因此,如果您希望实例具有属性,则需要将它们添加到该对象:

function Person() {

    // assign to public properties
    this.fName = "Dave";
    this.lName = "Smith";
};

顺便提一下,按照惯例,打算作为构造函数调用的函数的名称以大写字母开头。

答案 2 :(得分:2)

您将这些变量声明为函数的本地变量,而不是将它们作为对象的一部分。为了将它们放在实例中,你必须在构造函数中使用'this'。例如:

function person() {
    this.fName = 'Dave';
    this.lName = 'Smith';
}

person.prototype.fullName = function () {
    return this.fName + " " + this.lName;
};

var myPerson = new person();

alert(myPerson.fullName());

答案 3 :(得分:0)

在构造函数中,您应该将变量分配给this

    this.fName = null;
    this.lName = null;

但他们不是私人的。 JavaScript没有像“经典”面向对象语言那样的私有变量。唯一的“私有”变量是局部变量。上面的替代方法是将getter / setter方法分配给构造函数中的this