<>强构造函数和原型对象强>
构造函数也是函数,用新的创建对象时调用的函数,与普通函数的一个区别是,其首字母应该大写。但如果将构造函数当作普通函数调用(缺少新关键字),则应该注意这指向的问题。
var name=癙omy”; 函数每(){ 控制台。日志(“Hello”+ this.name); } var per1=new每();//澳愫谩倍ㄒ? var per2=每();//澳愫肞omy”
使用新时,会自动创建这对象,其类型为构造函数类型,指向对象实例;缺少新关键字,这指向全局对象。
可以用instanceof来检测对象类型,同时每个对象在创建时都自动拥有一个构造函数属性,指向其构造函数(字面量形式或对象构造函数创建的对象,指向对象,自定义构造函数创建的对象则指向它的构造函数)。
控制台。日志(per1 instanceof/);//正确的 console.log (per1。构造函数===/);//真正的
每个对象实例都有一个内部属性:[[原型]],其指向该对象的原型对象。构造函数本身也具有原型属性指向原型对象。所有创建的对象都共享该原型对象的属性和方法。
函数的人(){} Person.prototype.name=" dwqs”; Person.prototype.age=20; Person.prototype.sayName=function () { 警报(this.name); }; var per1=新人(); per1.sayName ();//dwqs var per2=新人(); per2.sayName ();//dwqs 警报(per1。sayName==per2.sayName);//真正的
所以,实例中的指针仅指向原型,而不指向构造函数。ES5提供了hasOwnProperty()和isPropertyOf()方法来反应原型对象和实例之间的关系
警报(Person.prototype.isPrototypeOf (per2));//正确的 per1。博客=" www.ido321.com "; 警报(per1.hasOwnProperty(“博客”));//正确的 警报(Person.prototype.hasOwnProperty(“博客”));//错误 alert (per1.hasOwnProperty("名称"));//错误 alert (Person.prototype.hasOwnProperty("名称"));//真正的
因为原型对象的构造函数属性是指向构造函数本身,所以在重写原型时,需要注意构造函数属性的指向问题。
函数Hello () { this.name=名称; }//重写原型 你好。原型={ sayHi:函数(){ console.log (this.name); } }; var=new你好你好(“Pomy”); 控制台。日志(嗨instanceof你好);//正确的 console.log(嗨。构造函数===你好);//错误 console.log(嗨。构造函数===对象);//真正的
使用对象字面量形式改写原型对象改变了构造函数的属性,因此构造函数指向对象,而不是你好。如果构造函数指向很重要,则需要在改写原型对象时手动重置其构造函数属性
你好。原型={ 构造函数:你好, sayHi:函数(){ console.log (this.name); } }; console.log(嗨。构造函数===你好);//正确的 console.log(嗨。构造函数===对象);//错误
利用原型对象的特性,我们可以很方便的在JavaScript的内建原型对象上添加自定义方法:
Array.prototype.sum=function () { 返回this.reduce(函数(上一页,cur) { 返回上一页+坏蛋; }); }; var num=[1, 2, 3, 4, 5, 6); var res=num.sum (); console.log (res);//21 String.prototype。把=function () { 返回this.charAt (0) .toUpperCase () + this.substring (1); }; var味精=癶ello world”; console.log (msg.capit ());//癏ello World”
<强>继承强>
原型利用[[]]特性,可以实现原型继承;对于字面量形式的对象,会隐式指定Object.prototype为其(原型),也可以通过Object.create()显示指定,其接受两个参数:第一个是[[原型]]指向的对象(原型对象),第二个是可选的属性描述符对象。
var={书 标题:“这是书名”; };//和下面的方式一样 var书=Object.create (Object.prototype, { 标题:{ 可配置:没错, 可列举的:真的, 价值:“这是书名”, wratable:真 } });
字面量对象会默认继承自对象,更有趣的用法是,在自定义对象之间实现继承。