首页 新闻 会员 周边

关于javascript原型的一个小问题

0
[已解决问题] 解决于 2017-10-27 14:41

如题,创建一个People构造函数

function People(name,weight){
            this.name = name;
            this.weight = weight;
            this.speak = function(){
                return 'I am '+this.name+",and my weight is "+this.weight;
            }
        }
        /*
        */
        People.prototype.height = 203;
        People.prototype.run = function(){
            return "I am running";
        }
        //或者这么写(第二种)
        /*
        People.prototype = {
            weight:70,
            height:175,
            run:function(){
                return "I am running"; 
            }
        };
        */
        var james = new People("James",113);
        console.log(james.run());//I am running
        console.log(james.constructor.prototype.constructor);//People()
        console.log(james.constructor.prototype.height);//203
        //console.log(james.constructor.prototype.height);//undefined

当用第二种方式给原型添加属性时,实例化james对象后,没法访问构造器函数上的原型属性,为undefined。但是用第一种方式书写,就可以访问,得到203。

请问各位,这是一个什么原因呀,是写法不对嘛,写法不对的话,用第二种方式写的时候,还是可以访问其run方法的呀,还是其它什么问题?求指教,谢谢!

痞子Geeking的主页 痞子Geeking | 初学一级 | 园豆:9
提问于:2017-10-25 17:53
< >
分享
最佳答案
1

第一种方式,你设置的是People原型的属性,所以console.log(james.constructor.prototype.height),这里james.constructor指向的是People对象,原因是默认情况下,constructor:People

而第二种方式,你是新定义了People的原型对象,原型对象的constructor方法已经丢失了,这时james.constructor指向的是function Object()(新定义对象的constructor:Object),所以james.constructor.prototype指向的是Object(),所以james.constructor.prototype.height就是undefined(因为确实没有定义),而直接james.height直接调用的是james原型对象的属性,所以是没有问题的。

 

以上是我的理解,希望能帮到你

奖励园豆:5
H.U.C-王子 | 菜鸟二级 |园豆:223 | 2017-10-25 19:07

是呀,我知道直接jame.height是可以获取到原型上的属性的。

现在的问题是我用

People.prototype.height = 203;
People.prototype.run = function(){
    return "I am running";
}

然后就能获取到构造函数原型上的属性

console.log(james.constructor.prototype.height);//203

但是我用这种方式给原型添加属性

People.prototype = {
            weight:70,
            height:175,
            run:function(){
                return "I am running"; 
            }
        };

再获取console.log(james.constructor.prototype.height);就获取不到了,得到的是undefined。

这是为什么呀?

痞子Geeking | 园豆:9 (初学一级) | 2017-10-25 22:05

@痞子Geeking: 

第一种方式,你设置的是People原型的属性,所以console.log(james.constructor.prototype.height),这里james.constructor指向的是People对象,原因是默认情况下,constructor:People

而第二种方式,你是新定义了People的原型对象,原型对象的constructor方法已经丢失了,这时james.constructor指向的是function Object()(新定义对象的constructor:Object),所以james.constructor.prototype指向的是Object(),所以james.constructor.prototype.height就是undefined(因为确实没有定义),而直接james.height直接调用的是james原型对象的属性,所以是没有问题的。

 

以上是我的理解,希望能帮到你

H.U.C-王子 | 园豆:223 (菜鸟二级) | 2017-10-26 10:19

@H.U.C-王子: 感谢老铁!

constructor,prototype,__proto__这几个属性确实绕得有点头晕。

痞子Geeking | 园豆:9 (初学一级) | 2017-10-26 18:15
其他回答(1)
1
People.prototype = {
  constructor: People,
  weight:70,
  height:175,
  run:function(){
      return "I am running"; 
  }
};
by.Genesis | 园豆:2719 (老鸟四级) | 2017-10-26 10:17

谢谢!

支持(0) 反对(0) 痞子Geeking | 园豆:9 (初学一级) | 2017-10-26 18:15
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册