首页 > Web开发 > 详细

JS原型对象

时间:2019-10-25 16:11:58      阅读:79      评论:0      收藏:0      [点我收藏+]

1.构造函数的缺点:

  JavaScript 通过构造函数生成新对象,因此构造函数可以视为对象的模板。实例对象的属性和方法,可以定义在构造函数内部。  

    1.什么是构造函数?

       就是function一个函数,然后都过this去创建该函数的属性和方法----这就是一个构造函数       ------>其他不通过this的叫普通函数

    2.缺点在此:

       同一个构造函数可以通过 New 创建无数个实例-----》但是这些New出来的实例之间却无法共享属性,太浪费系统资源

 

2.通过构造函数的这个缺点便引出来------ JavaScript 的原型对象(prototype)

  JavaScript 继承机制的设计思想就是,原型对象的所有属性和方法,都能被实例对象共享------》简单来说就是如果属性和方法都定义在原型上,那么所有实例边都可以共享了-------》便解决了构造函数的缺点

    1.例子:

function Animal(name) {
  this.name = name;
}
Animal.prototype.color = ‘white‘;

var cat1 = new Animal(‘大毛‘);
var cat2 = new Animal(‘二毛‘);

cat1.color // ‘white‘
cat2.color // ‘white

    通过上面实例更容易懂的JavaScript原型的概念

    2.需要注意的地方:      

       当实例对象本身没有某个属性或方法的时候,它会到原型对象去寻找该属性或方法。这就是原型对象的特殊之处。

       如果实例对象自身就有某个属性或方法,它就不会再去原型对象寻找这个属性或方法。

 

3.JavaScript原型链是什么?

  JavaScript 规定,所有对象都有自己的原型对象(prototype)。

    1.概念:

       1.一方面,任何一个对象,都可以充当其他对象的原型;

       2.另一方面,由于原型对象也是对象,所以它也有自己的原型。

       3.因此,就会形成一个“原型链”(prototype chain):对象到原型,再到原型的原型……

    2.理解:

       1.一层层地上溯,所有对象的原型最终都可以上溯到Object.prototype,即Object构造函数的prototype属性。也就是说,所有对象都继承了Object.prototype的属性。这就是所有对象都有valueOftoString方法的原因,因为这是从Object.prototype继承的。

       2.Object.prototype对象有没有它的原型呢?

          答案:肯定是有的--------》Object.prototype的原型就是null----->由于null没有任何属性,所以即为原型链的尽头

       3.注意:

          读取对象的某个属性时,JavaScript 引擎先寻找对象本身的属性,如果找不到,就到它的原型去找,如果还是找不到,就到原型的原型去找。如果直到最顶层的Object.prototype还是找不到,则返回undefined

          如果对象自身和它的原型,都定义一个同名属性,那么优先读取对象自身的属性,这叫做“覆盖”(overriding)。

          注意,一级级向上,在整个原型链上寻找某个属性,对性能是有影响的。所寻找的属性在越上层的原型对象,对性能的影响越大。如果寻找某个不存在的属性,将会遍历整个原型链

 

4.原型对象(prototype)的属性constructor

  该属性的作用就是-----》指向该原型对象所在的构造函数-----》可以得知某个实例对象,到底是哪一个构造函数产生的。

 

5.构造函数的继承(原型的继承) 

function Sub(value) {
  Super.call(this);
  this.prop = value;
}

//方法一
Sub.prototype = Object.create(Super.prototype);
Sub.prototype.constructor = Sub;
Sub.prototype.method = ‘...‘;
//1.上面代码中,Sub是子类的构造函数,this是子类的实例。在实例上调用父类的构造函数Super,就会让子类实例具有父类实例的属性。
//2.Sub.prototype是子类的原型,要将它赋值为Object.create(Super.prototype),而不是直接等于Super.prototype。否则后面两行对Sub.prototype的操作,会连父类的原型Super.prototype一起修改掉。

//方法二
Sub.prototype = new Super();
//上面这种写法也有继承的效果,但是子类会具有父类实例的方法。有时,这可能不是我们需要的,所以不推荐使用这种写法。

 上面代码就解释了什么是继承

JS原型对象

原文:https://www.cnblogs.com/yxkNotes/p/11738339.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!