如题,创建一个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方法的呀,还是其它什么问题?求指教,谢谢!
第一种方式,你设置的是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原型对象的属性,所以是没有问题的。
以上是我的理解,希望能帮到你
是呀,我知道直接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:
第一种方式,你设置的是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-王子: 感谢老铁!
constructor,prototype,__proto__这几个属性确实绕得有点头晕。
People.prototype = { constructor: People, weight:70, height:175, run:function(){ return "I am running"; } };
谢谢!