javascript - 为什么prototype.setName和this.setName可以返回不同的值?

标签 javascript

这是我的代码。我很好奇 prototype.setNamethis.setName 有什么不同。为什么当我调用 p2.setName() 时,我会得到相同的 p2 值?谢谢。

function Person(){
    var name = '';
}

Person.prototype.setName = function (value){
    name = value;
}   
Person.prototype.getName = function (){
    return name;
}

function Sprite(){
    var name = '';
    this.setName = function (value){
        name = value;
    }
    this.getName = function(){
        return name;
    }
}

var p1 = new Person();
p1.setName('p1');
var p2 = new Person();
p2.setName('p2');
console.log(p1.getName()) // p2
console.log(p2.getName()) // p2

var s1 = new Sprite('s1');
s1.setName('s1');
var s2 = new Sprite('s2');
s2.setName('s2');
console.log(s1.getName()); //s1
console.log(s2.getName()); //s2

最佳答案

原因是您在 Person() 中声明的 name 变量仅是该函数的本地变量,不与原型(prototype)函数共享。

因此,以下内容将创建一个名为 name 的新全局变量。

Person.prototype.setName = function (value){
   name = value;
}

由于该变量是全局变量,因此它由 p1p2 共享(请注意,如果您添加 'use strict'; 以上导致异常而不是自动创建全局)。

您应该按照 @beautifulcoder 的建议进行操作,并使用 this 使变量成为对象的属性,如下所示

function Person(){
    this.name = '';
}

Person.prototype.setName = function (value){
    this.name = value;
};   
Person.prototype.getName = function (){
    return this.name;
};

最后,Sprite() 起作用的原因是因为 set 和 get 函数是在本地 name 变量的范围内定义的,因此它们创建一个闭包并使用本地 name 而不是创建全局变量。

关于javascript - 为什么prototype.setName和this.setName可以返回不同的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31101341/

相关文章:

javascript - 检测背景选项卡是否在 javascript 或 jQuery 中打开

javascript - 使用 AngularJs 在 firebase 中创建用户

javascript - "this"在 map 运算符 Angular 中未定义

javascript - Opera 扩展中注入(inject)的脚本

javascript - 在 ajax json 中合并分页

javascript - 函数和方程混淆

javascript - 为什么隐藏字段值不会更新

c# - 从 c#/asp.net 打开 HTML 页面

javascript - 如何设置 x 轴标签的宽度?

javascript - Firefox Web 扩展覆盖新标签页