Javascript 如何确保耐用物品';私人会员是真正的私人会员

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 =

尝试学习如何使用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  = 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,第三版”,书中说“持久的构造函数……永远不会使用新操作符调用。”如果使用该模式,则会调用新的,并在
上定义属性,它们将是默认情况下返回的对象的一部分。根据定义,持久的构造函数模式避免了
这个
新的
。相反,它只显式返回方法,不返回可见的数据成员。那么在你的考试中呢