Javascript 无法分配此。对象原型中的变量
我目前正在研究javascript原型,对它的实际工作原理感到困惑。我有这个代码片段,它工作得非常好Javascript 无法分配此。对象原型中的变量,javascript,oop,this,prototype,encapsulation,Javascript,Oop,This,Prototype,Encapsulation,我目前正在研究javascript原型,对它的实际工作原理感到困惑。我有这个代码片段,它工作得非常好 function Message(msg){ this.msg =msg; } Message.prototype = { constructor:Message, display: function(){ return this.msg; } }; alert(new Message("007").display()); 这段代码试
function Message(msg){
this.msg =msg;
}
Message.prototype = {
constructor:Message,
display: function(){
return this.msg;
}
};
alert(new Message("007").display());
这段代码试图通过使用javascript演示一个简单的封装
现在的问题是,我想添加这个文本:this.msg,而不是使用display方法
Message.prototype = {
constructor:Message,
someValue:99,
text: this.msg,
display: function(){
return this.msg;
}
};
但我只有在打电话的时候才不确定
alert(new Message("007").text);
但是打电话
alert(new Message("007").someValue);
显示99。这里有什么问题?在声明原型时,它看到行
text:this.msg,
,并将其text
属性分配给其this
的msg
属性的值。但此时的this
引用了全局/窗口对象,其.msg
属性未定义
另一方面,当调用display
时,实例化对象已运行其构造函数,因此已填充实例化对象的msg
属性,并使用预期的调用上下文运行display
。(其中此
是实例化对象)只需继续使用显示
属性即可
(另外,您不需要在原型中定义构造函数:只需在原型中完全去掉
构造函数:
行)在声明原型时,它会看到行text:this.msg,
,并将其text
属性分配给其this
属性的值。但此时的this
引用了全局/窗口对象,其.msg
属性未定义
另一方面,当调用display
时,实例化对象已运行其构造函数,因此已填充实例化对象的msg
属性,并使用预期的调用上下文运行display
。(其中此
是实例化对象)只需继续使用显示
属性即可
(另外,您没有在原型中定义构造函数:只需在原型中完全取消
构造函数:
行)这是因为在准备Message.prototype
对象时,此
不引用消息
类。如果您想在单个实例的原型对象访问属性(如.msg
)上使用某些共享属性,则需要一个getter@从原始对象或原型中获取Bergi getter?@ReubenJaMesAveñoGruta我的意思是get text(){return this.msg}
在原型中。在实例上访问.text
将使该实例成为this
。这是因为在准备Message.prototype
对象时,this
并不引用Message
类。如果您希望原型对象上的某些共享属性,请访问属性(如.msg
)对于单个实例,您需要一个getter@从原始对象或原型中获取Bergi getter?@ReubenJaMesAveñoGruta我的意思是get text(){return this.msg}
在原型中。在实例上访问.text
将使该实例成为此
。谢谢!“但此时的‘this’指的是全局/窗口对象,其.msg属性未定义。”这是否意味着必须使用构造函数或函数才能对全局/窗口对象进行阴影处理?@Reuben JaMes Aveño Gruta您永远不应该使用this
来指代全局对象-事实上,在严格模式下是禁止的,这很好用。通常,如果要访问全局对象上的属性,可以使用属性名称(如foo
)来访问window.foo
。谢谢!“但此时的‘this’指的是全局/窗口对象,其.msg属性未定义。”这是否意味着必须使用构造函数或函数才能对全局/窗口对象进行阴影处理?@Reuben JaMes Aveño Gruta您永远不应该使用this
来指代全局对象-事实上,在严格模式下是禁止的,这很好用。通常,如果要访问全局对象上的属性,只需使用属性名称,例如foo
,即可访问window.foo
。