猿问

JS面向对象的new操作

创建了一个函数Shape,在他的prototype上写了一个name属性和toString方法,接着输出Shape的name属性和调用toString方法。
然后new一个Shape的实例——Triangle,分别输出Triangle的name属性和调用toString方法,结果如下:
varShape=function(){};
Shape.prototype.name='Shape';
Shape.prototype.toString=function(){
returnthis.name;
}
console.log(Shape.name);//''
console.log(Shape.toString());//function(){}
varTriangle=newShape();
console.log(Triangle.name);//'Shape'
console.log(Triangle.toString());//'Shape'
记得new操作完成了两件事:
1.将this指向实例
2.将实例的__proto__或者说[[prototype]]指向构造函数的prototype属性。(有不对和漏的地方请补充!)这样可以理解实例函数去__proto__中查找name属性和toString()方法。
而构造函数似乎直接去爬原型链了,为什么它不先在自身的属性中查找呢?试着给Triangle的prototype加一个同名属性和方法:
Triangle.prototype={};//这里还有一个疑问,new出来的对象
//没有prototype属性,是因为函数要作为构造函数
//所以内置了prototype属性么?
Triangle.prototype.name='Triangle';
Triangle.prototype.toString=function(){
return'Iam'+this.name;
}
console.log(Triangle.name);//'Shape'
console.log(Triangle.toString());//'Shape'
嘛...和构造函数一个德行,求解惑~谢谢!
HUX布斯
浏览 238回答 2
2回答

梦里花落0921

看来题主还不是很理解js是基于原型的编程语言,它可以模仿面向对象,但它从根本上是基于原型的。如果题主想要模仿继承应该这么做:varShape=function(){};Shape.prototype={constructor:Shape,type:'Shape',toString:function(){returnthis.type;}}varTriangle=function(){};Triangle.prototype=newShape();Triangle.prototype.type='Triangle';可以试一下结果:vart=newTriangle();tinstanceofTriangle//truetinstanceofShape//truet.toString()//'Triangle'接下来解释一下为什么题主你那样写不正确:1.varTriangle=newShape();这句创建了一个Shape实例,而并没有创建一个新的原型。2.Triangle.prototype={};这句以及接下来的几句都重新创建了一个原型,而并没有修改原本的原型。有什么疑问可以追问。
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答