Javascript 如何确保耐用物品';私人会员是真正的私人会员
尝试学习如何使用JavaScript创建持久对象,但正如您从下面的示例中看到的,您可以轻松访问Person实例的任何成员—我做错了什么Javascript 如何确保耐用物品';私人会员是真正的私人会员,javascript,private-members,Javascript,Private Members,尝试学习如何使用JavaScript创建持久对象,但正如您从下面的示例中看到的,您可以轻松访问Person实例的任何成员—我做错了什么 function Person(name, age, job){ "use strict"; //create the object to return var o = new Object(); //optional: define private variables/functions here o.name =
function Person(name, age, job){
"use strict";
//create the object to return
var o = new Object();
//optional: define private variables/functions here
o.name = name;
o.age = age;
o.job = job;
//attach methods
o.sayName = function(){
alert(name);
};
//return the object
return o;
}
var newGuy = Person("Guy", 21, "Seeker");
newGuy.name; // "Guy" <- Shouldn't this return an error or "undefined"?
职能人员(姓名、年龄、职务){
“严格使用”;
//创建要返回的对象
var o=新对象();
//可选:在此处定义专用变量/函数
o、 名称=名称;
o、 年龄=年龄;
o、 工作=工作;
//附加方法
o、 sayName=函数(){
警报(名称);
};
//返回对象
返回o;
}
var newGuy=人(“人”,21,“探索者”);
newGuy.name;//“Guy”您将获得“Guy”
,因为您将其设置为o
的name
属性,然后将o
返回到外部,使其公开
如果需要私有变量,可以使用
function Person(name, age, job){
"use strict";
// name, age, job are private variables
// sayName is a privileged method
this.sayName = function(){
alert(name);
};
}
var newGuy = new Person("Guy", 21, "Seeker");
newGuy.name; // undefined
注意:您不需要创建一个新的o
对象并返回它,只需使用new
操作符调用构造函数并将公共/特权属性分配给this
我建议阅读Douglas Crockford的著作。你会得到“Guy”
,因为你将它设置为o
的name
属性,然后将o
返回到外部,公开它
如果需要私有变量,可以使用
function Person(name, age, job){
"use strict";
// name, age, job are private variables
// sayName is a privileged method
this.sayName = function(){
alert(name);
};
}
var newGuy = new Person("Guy", 21, "Seeker");
newGuy.name; // undefined
注意:您不需要创建一个新的o
对象并返回它,只需使用new
操作符调用构造函数并将公共/特权属性分配给this
我建议阅读道格拉斯·克罗克福德的著作。有很多不同的方法来创建私有财产。它们都找到了利用变量在函数中的局部作用域,但可以在函数中捕获这一事实的方法
例如,您可以返回一个具有私有访问权限的不同对象,而不是返回o(它将公开所有属性)。这段代码中有一些冗余,但我想让它接近您的示例:
function person(name, age, job){
"use strict";
//optional: define private variables/functions here
var name = name;
var age = age;
var job = job;
//return the object that uses variable, that are only visible within the function
return {
sayName: function(){
alert(name);
},
sayJob: function(){
alert(job);
}
}
}
var newGuy = person("Guy", 21, "Seeker");
newGuy.sayName();
newGuy.sayJob();
alert("undefined: ", newGuy.name); // "Guy" <- Shouldn't this return an error or "undefined"?
职能人员(姓名、年龄、职务){
“严格使用”;
//可选:在此处定义专用变量/函数
变量名称=名称;
var年龄=年龄;
var job=job;
//返回使用变量的对象,该变量仅在函数中可见
返回{
sayName:function(){
警报(名称);
},
sayJob:function(){
警觉(工作);
}
}
}
var newGuy=人(“人”,21,“探索者”);
newGuy.sayName();
newGuy.sayJob();
警报(“未定义:”,newGuy.name);//“盖伊”有很多不同的方法来创建私有财产。它们都找到了利用变量在函数中的局部作用域,但可以在函数中捕获这一事实的方法
例如,您可以返回一个具有私有访问权限的不同对象,而不是返回o(它将公开所有属性)。这段代码中有一些冗余,但我想让它接近您的示例:
function person(name, age, job){
"use strict";
//optional: define private variables/functions here
var name = name;
var age = age;
var job = job;
//return the object that uses variable, that are only visible within the function
return {
sayName: function(){
alert(name);
},
sayJob: function(){
alert(job);
}
}
}
var newGuy = person("Guy", 21, "Seeker");
newGuy.sayName();
newGuy.sayJob();
alert("undefined: ", newGuy.name); // "Guy" <- Shouldn't this return an error or "undefined"?
职能人员(姓名、年龄、职务){
“严格使用”;
//可选:在此处定义专用变量/函数
变量名称=名称;
var年龄=年龄;
var job=job;
//返回使用变量的对象,该变量仅在函数中可见
返回{
sayName:function(){
警报(名称);
},
sayJob:function(){
警觉(工作);
}
}
}
var newGuy=人(“人”,21,“探索者”);
newGuy.sayName();
newGuy.sayJob();
警报(“未定义:”,newGuy.name);//“盖伊”对于耐用物品,道格拉斯·克罗克福德建议避免使用“这个”和“新的”。这就是你如何实现你想要的:
var person = function (vals) {
var that = {}; // create object to avoid constructing with "new" and using "this"
that.sayName = function () { // bind accessor functions
return vals.name; // use passed values to ensure privacy
};
return that;
};
var guy = person({name: "Guy"}); // avoided use of "new"
alert(guy.name); // undefined as should be
guy.sayName(); // "Guy"
你可以在他的书中找到更多信息:Javascript:The Good Parts,第52页。我希望这能有所帮助。对于耐用物品,道格拉斯·克罗克福德建议避免使用“这个”和“新的”。这就是你如何实现你想要的:
var person = function (vals) {
var that = {}; // create object to avoid constructing with "new" and using "this"
that.sayName = function () { // bind accessor functions
return vals.name; // use passed values to ensure privacy
};
return that;
};
var guy = person({name: "Guy"}); // avoided use of "new"
alert(guy.name); // undefined as should be
guy.sayName(); // "Guy"
你可以在他的书中找到更多信息:Javascript:The Good Parts,第52页。我希望这会有所帮助。那么,只要我不在任何地方返回“private”变量,它们就仍然是私有的,这样说安全吗?对于持久构造函数,使用new关键字和不使用new关键字有什么区别?我问这个问题的原因是,根据我正在读的Nicholas Zakas的书“Professional:JavaScript for Web Developers,第三版”,书中说“持久的构造函数……永远不会使用新操作符调用。”如果使用该模式,则会调用新的,并在上定义属性,它们将是默认情况下返回的对象的一部分。根据定义,持久的构造函数模式避免了这个
和新的
。相反,它只显式返回方法,不返回可见的数据成员。因此,在您的示例中,您不会将属性分配给“o”,而是将方法分配给对函数中的私有变量具有特权访问权的o。当您返回o时,除了您定义的方法之外,它不会有任何其他属性。这些是私有数据的唯一路由。请参阅持久构造函数:那么,只要我不在任何地方返回“私有”变量,它们就会保持私有,这是安全的吗?对于持久构造函数,使用new关键字和不使用new关键字有什么区别?我问这个问题的原因是,根据我正在读的Nicholas Zakas的书“Professional:JavaScript for Web Developers,第三版”,书中说“持久的构造函数……永远不会使用新操作符调用。”如果使用该模式,则会调用新的,并在上定义属性,它们将是默认情况下返回的对象的一部分。根据定义,持久的构造函数模式避免了这个
和新的
。相反,它只显式返回方法,不返回可见的数据成员。那么在你的考试中呢