JavaScript 中,万物皆对象!
分为普通对象和函数对象,凡是通过 new Function() 创建的对象都是函数对象,其他的都是普通对象
JS 在创建对象(不论是普通对象还是函数对象)的时候,都有一个叫做__proto__ 的内置属性,用于指向创建它的构造函数的原型对象。
而其中每个函数对象都有一个prototype
属性
所谓原型链就是找妈的一种行为方式,就可以理解为人是人他妈生的,妖是妖他妈生的。
原型链的核心其实就只有一个:属性共享和独立的控制
当你的对象实例需要独立的属性,所有做法的本质都是在对象实例里面创建属性
使用原型继承的时候,要对于原型中的属性要特别注意,因为他们都是牵一发而动全身的存在
现在最常用的方法是组合模式。
组合式继承
function Super(){
// 只在此处声明基本属性和引用属性
this.val = 1;
this.arr = [1];
}
// 在此处声明函数
Super.prototype.fun1 = function(){};
Super.prototype.fun2 = function(){};
function Sub(){
Super.call(this); // 核心 通过Super.call(this);继承父类的基本属性和引用属性并保留能传参的优点
}
Sub.prototype = new Super(); // 核心 通过Sub.prototype = new Super();继承父类函数,实现函数复用
var sub1 = new Sub(1);
var sub2 = new Sub(2);
console.log(sub1.fun === sub2.fun); // true