最后总标题:https://segmentfault.com/a/11...问:你有object吗?答:不。笨蛋!有一个新的不是很好吗!问题点:为什么需要了解newanobject的过程?答:如果你不了解这个过程,你就不知道为什么这个实例只需要new它就可以使用原型的各种方法。new一个对象的过程:需要经过4个步骤,结合上一章的原型模式为例。varcat=newAnimal('橙猫');1.创建一个新的空对象。varcat={}2.设置新对象的隐式原型指向其构造函数的显式原型cat._proto_=Animal.protype3.执行构造函数代码,this指向新对象。Animal.call(cat)4.返回对象(returnthis)varcat=newAnimal();(将返回的对象保存在变量cat中,所以这只猫是这个对象的一个??实例,所以cat本身也是一个对象)好了,你就有了一个对象。你不正常。如果还是难以理解的话,我说的简单点:原代码是这样的。//构造函数Animal(name){this.name=name;//为什么要把原型中的方法放到构造函数中,因为2.设置新对象的隐式原型指向其构造函数的显式原型this.eat=function(val){console.log(this.name+'喜欢吃'+val);}}使用new操作符后,就变成这样了。//构造函数Animal(名称){//1.创建一个空对象(为了方便理解,我们让这个对象叫做this)varthis={};//3。执行构造函数代码并将其添加到此属性和方法中。this.name=名称;this.eat=function(val){console.log(this.name+'喜欢吃'+val);}//4。返回对象(returnthis)returnthis;所以当我们varcat=newAnimal('orangecat');等价于varcat=this;//可以使用this中的方法属性cat。验证:让我们验证一下我们是否做了上面的事情。验证步骤二:在控制台输出日志:从上图可以看出,cat._proto_和Animal.protype是完全等价的。解释2成立。验证步骤3和4://constructorfunctionAnimal(name){this.name=name;console.log('this:',this)}//原型Animal.prototype={eat:function(val){console.log(this.name+'likeeat'+val);}}Animal();//window从上面可以看出,在没有实例化的时候(没有new的时候),this指向window。然后看new之后this会不会指向这个新对象。//构造函数Animal(name){this.name=name;console.log('this:',this)}//原型Animal.prototype={eat:function(val){console.log(this.name+'likeeat'+val);}}//实例化varcat=newAnimal('orangecat');console.log('catis:',cat)控制台输出日志如下:两者完全一致,由此可以验证第3、4步成立。构造函数被执行并且this指向新对象。问题:什么是隐式原型和显式原型?为什么cat可以调用显式原型中的东西?下次:原型链https://segmentfault.com/a/11...
