2 u011042188 u011042188 于 2015.06.18 18:12 提问

JavaScript 面向对象的问题

笔试的时候遇到这个题

  function ClassA() {
        var value=4;
        this.getValue= function()
        {
            return value;
        }

        this.setValue= function(value)
        {
            this.value=value;

        }

            var classA = new ClassA();
            document.write(classA.getValue());
            classA.setValue(1);
            document.write(classA.getValue());
            document.write(classA.value);

为什么输出结果是441

5个回答

zhanshaofu
zhanshaofu   2015.06.18 19:22
已采纳

补充上条,回答,this.value其实是原型变量,在classA函数内部定义为classA.prototype.value; 与 var value是两个不同的变量。

bulusli3
bulusli3   Ds   Rxr 2015.06.18 18:28

第一个和第二个4其实都是输出的var value=4这个值,而第三个classA.value输出的是this.value的值,而这个值已经被setValue设置为1了,this.value和var value=4这个value没有任何关系,只是一个声明而已。

u011042188
u011042188   2015.06.18 20:45

谢谢各位的回答:现在总结如下,var value和this.value不是一个变量,而this.value和classA.value和ClassA.prototype.value是同一个变量。

vuturn
vuturn   2015.06.21 10:20

this.value 是实例属性 每个实例独有且不相同,var value 其实就是局部变量 实例通过属性访问器.访问不了 它不是原型属性ClassA.prototype.value 是原型属性 所有的实例都共享该属性 可以通过属性访问器.访问 所以以上的说法不准确

u011042188
u011042188 您的意思是:var value 不能通过属性访问器访问,除非用get ?而原型属性ClassA.prototype.value 可以用属性访问器访问,像这样:ClassA.value?
2 年多之前 回复
vuturn
vuturn   2015.06.22 09:08

var value;就是一个私有变量,没有其他任何意义。只有通过调用特权方法getValue才可以访问。
原型属性ClassA.prototype.value ,对象的实例可以访问,例如: classA.value;对象本身ClassA.value是undefined。
原型链原理:实例顺着原型链会找到对象的原型 (ClassA.prototype),因此classA.value访问的就是ClassA.prototype.value,而ClassA.value访问的就是Object.prototype.value(ClassA是Object对象的实例),因此是undefined。

function ClassA(){
    var value=4;

    this.getValue=function(){
        return value;
    }

    this.setValue=function(value){
        this.value=value;
    }
}
ClassA.prototype.value=1;
Object.prototype.value=2;
var instance1=new ClassA();
var instance2=new ClassA();

console.log(instance1.value); //1
console.log(ClassA.value); //2


u011042188
u011042188 谢谢大神的回答,这次懂了
2 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片