我有以下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"
。为什么这样,我该如何解决?
答案 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();
上的实时演示
答案 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
。