javascript——原型,继承

  • 2019-03-30
  • 177
  • 2

js的原型和继承还是很大一块的,之前有看过一些,但是没有好好整理一番,
镇:

原型

1.__proto__(隐式原型) &&prototype(显式原型)

显示原型
每一个函数在创建之后都会拥有一个名为prototype的属性,这个属性指向函数的原型对象。

Note: 通过Function.prototype.bind方法构造出来的函数是个例外,它没有prototype属性。

隐式原型
JavaScript中任意对象都有一个内置属性[[prototype]],在ES5之前没有标准的方法访问这个内置属性,但是大多数浏览器都支持通过proto来访问。ES5中有了对于这个内置属性标准的Get方法Object.getPrototypeOf().

Note: Object.prototype 这个对象是个例外,它的proto值为null(见定图)

作用
1.显示原型:一般用于原型继承的实现。
2.隐式原型:构成原型链,同样用于实现基于原型的继承。举个例子,当我们访问obj这个对象中的x属性时,如果在obj中找不到,那么就会沿__proto__依次查找。

原型链

形成
说到原型,我们就会想到js的原型链,首先我们要知道原型链的构成是通过隐式原型__proto__,这里有个前置条件就是js中对象拥有__proto__属性,在js中万物皆对象,所以就会保证了链路的形成,以至于不会随随便便就来个短链,
通过上图可以看出这个链路的顶端就是 null

作用
说到了产生,那么一定要说下的他的作用吧,万物存在必有它存在的道理,js对象有个这样的规则:

如果试图引用对象(实例instance)的某个属性,会首先在对象内部寻找该属性,直至找不到,然后才在该对象的原型(instance.prototype)里去找这个属性.

那么原型链就起到这个链路的作用.

问题
原型链也有他存在的的问题
1.当原型链中的某一个原型包含了引用类型值时,这个引用类型值会被所有实例共享,
2.在创建子类型(例如创建Son的实例)时,不能向超类型(例如Father)的构造函数中传递参数.

继承

1.经典继承(解决上述2问题)

function Father(){
    this.colors = ["red","blue","green"];
}
function Son(){
    Father.call(this);//继承了Father,且向父类型传递参数
}
var instance1 = new Son();
instance1.colors.push("black");
console.log(instance1.colors);//"red,blue,green,black"

var instance2 = new Son();
console.log(instance2.colors);//"red,blue,green" 可见引用类型值是独立的

附上一张图

未完待续…

彩蛋

__proto__ === .constructor.prototype是不对的,如果一个对象是通过Object.create函数构造出来的,.那其proto就不一定是.constructor.prototype

参考文章:
1.js中proto和prototype的区别和关系?

评论

  • LesAvarly回复

    Viagra Ou Acheter Forum Cialis Mit Rezept Bestellen Direct Cod Only Clobetasol Online Price Shop Free Shipping Viagra Soft