JavaScript面向对象精要(下部)

  

<>强构造函数和原型对象

  

构造函数也是函数,用新的创建对象时调用的函数,与普通函数的一个区别是,其首字母应该大写。但如果将构造函数当作普通函数调用(缺少新关键字),则应该注意这指向的问题。

        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);//真正的      

 JavaScript面向对象精要(下部)

  

所以,实例中的指针仅指向原型,而不指向构造函数。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:真   }   });      

字面量对象会默认继承自对象,更有趣的用法是,在自定义对象之间实现继承。

JavaScript面向对象精要(下部)