尝试更好地理解JS,有一些澄清。让我们假设我们有以下方法
var customer = function(){
var name = "Contoso";
return {
getName : function(){
return this.name;
},
setName : function(newName){
this.name = newName;
}
}
}();
为什么名称在外面不可见?,当我们记录(customer.name)其未定义时,但是如果我们删除函数的自初始化括号并将变量声明更改为(this.name)&再次当我们记录相同时,我们能够看到价值。我在这里缺少什么。
答案 0 :(得分:1)
您需要考虑JavaScript实际上没有本机类。有了这个说,你可以创建构造函数以“模仿”一个类并且能够使用this
,你需要创建这样的东西:
function fnc (string) {
this.string = string;
}
fnc.prototype.getString = function() {
return this.string;
}
var x = new fnc('bar');
console.log(x.getString()); //bar
这称为构造函数模式。 你要做的是使用一个名为Module Pattern的东西,它的工作原理如下:
var fn = (function() {
var string = 'foo';
return {
getString() {
return string;
}
}
})();
console.log(fn.getString()); //foo
以下是一个工作示例:https://repl.it/FCn7
另外,好读:https://addyosmani.com/resources/essentialjsdesignpatterns/book/
修改强>
使用getString
和setString
与模块模式
var fn = (function() {
var string = 'foo';
return {
getString() {
return string;
},
setString(str){
string = str;
}
}
})();
fn.setString('xyz');
console.log(fn.getString()); // xyz
答案 1 :(得分:0)
var
正在函数范围内创建变量,这在函数属性外部不可用。如果您想访问customer.name
等属性,则需要按照您的注意事项将其初始化为this.name
。
var
就像创建私有变量一样,可以通过函数修改,但不能直接修改。
这样可行:
var customer = function(){
var name = "Contoso";
return {
getName : function(){
return name;
},
setName : function(newName){
name = newName;
}
}
}();