实例对象原始模式
var cat = {
name : '',
color: ''
}
现在根据这个原型对象生成2个实例对象
var cat1 = {}
cat1.name = '1',
cat.color = 'blue'
var cat2 = {}
cat2.name
cat.color
这种是最简单的封装方式 把两个属性封装在一个对象里面 这样的写法有2个缺点 如果生成多个实例 会非常麻烦 第二是 实例与原型之前没有什么联系
所以如果用函数的方式来书写原型 可以解决代码重复的问题
function Cat(name,color){
return {
name : name
color : color
}
}
然后生成实例对象
var cat1 = Cat(name,color)
var cat2 = Cat(name,color)
相当于在调用函数
这样虽然解决了代码重复书写的问题 但是还有一个问题就是看不出来他们是同一个原型对象的实例 就是还是没有什么联系
为了解决从原型对象生成实例的问题,js提供了一个构造函数的模式 constructor 模式
所谓构造函数 其实就是一个普通函数 但是内部使用了this变量 对构造函数使用new运算符 就可以生成实例 并且this变量回绑定到实例对象上
function Cat(name,color){
this.name=name;
this.color=color;
}
var cat1 = new Cat("大毛","黄色");
var cat2 = new Cat("二毛","黑色");
这时候cat1 cat2 回自动含有一个constructor 属性 指向他们的构造函数
这时候js 还 提供了以恶个instanceof 的运算符 验证原型对象和实例对象之间关系的一个运算符
cat1 instanceof Cat ======> true
现在构造函数模式很好用 但是还有一个问题又出现了
构造函数很浪费内存
js规定 每一个构造函数都有一个prototype 属性 只想另外一个对象 这个对象所有属性和方法 都会被构造函数的实例 继承
这意味 我们可以把一些不变的属性和方法 直接定义在prototype 对象上
为了配合prototype属性 js定义了一些辅助方法 用来判断原型对象 和 某个实例之间的关系
实例和原型之间的关系
并且每一个是对象都一个hasOwnproperty 方法 可以判断某一个属性到底是本地属性 还是原型上的属性
对象之间的继承
第一种方法 使用call apply
第二种 就是使用prototype 属性
就是将实例的prototype指向需要继承对象的实例上 就可以获取到该实例的属性和原型的方法 但是这样坐有一个不好的地方 就是我们将我们这个实例的prototype指向了别的实例身上 那么自己的原型的constructor属性指向就不对了 所以需要让自己的原型的构造函数指向需要继承的那个对象的构造函数