Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 无法分配此。对象原型中的变量_Javascript_Oop_This_Prototype_Encapsulation - Fatal编程技术网

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()); 这段代码试

我目前正在研究javascript原型,对它的实际工作原理感到困惑。我有这个代码片段,它工作得非常好

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