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

时间:2015-06-28 15:14:06

标签: javascript

有我的代码。我很好奇不同的prototype.setNamethis.setName是什么。当我致电p2时,为什么我获得相同的p2.setName()值?感谢。

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

2 个答案:

答案 0 :(得分:2)

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

以下是创建一个名为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而不是创建全局变量。

答案 1 :(得分:0)

因为您忘记了this

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

这是一种令人困惑的设计模式。