- 在面向对象编程中,类和对象可想象为铸模和铸件地关系,对象老是从类中建立。
- 在原型编程地思想中,类不是必须的,对象也不必定从类中建立。对象是经过克隆另外一个对象获得的,若是须要一个和某对象一摸同样的对象,就能够用原型模式
-
Object.create能够用来克隆对象编程
var Plane = function(){
this.blood = 100;
this.attackLevel = 1;
this.defenseLevel = 1;
};
var plane = new Plane();
plane.blood = 500;
plane.attackLevel = 10;
plane.defenseLevel = 7;
var clonePlane = Object.create( plane );
console.log( clonePlane ); // 输出:Object {blood: 500, attackLevel: 10, defenseLevel: 7}
复制代码
在不支持 Object.create 方法的浏览器中,则可使用如下代码:设计模式
Object.create = Object.create || function( obj ){
var F = function(){};
F.prototype = obj;
return new F();
}
复制代码
- 克隆是建立对象的手段
原型链
假设有一原型链 : Object=>Animal=>Dog浏览器
当咱们尝试调用Dog对象的方法,而它自己却没有这个方法时,那么这个对象会把这个请求委托给它的原型Animal,并顺着原型链委托下去,直至找到该方法或者到达根对象。函数
JavaScript中的原型继承this
- 按照 JavaScript 设计者的本意,除了 undefined 以外,一切都应是对象。为了实现这一目标,number、boolean、string 这几种基本类型数据也能够过“包装类”的方式成对象类型数据来处理。
- js中的根对象是Object.prototype空对象。
- js中的函数既能够看成普通函数使用,也能够做为构造器调用。当使用new运算符调用函数时,这个函数就是构造器
- 就js的真正实现,并不能说对象有原型,而只能说对象的构造器有原型,对象把请求委托给它的构造器的原型。
- js给对象提供了一个命为proto隐藏对象,proto指向构造器的原型对象,{Constrctor}.prototype
-
手动给新建对象设置正确得 __ proto __ 指向可以使用prototype
obj.__proto__ = Constructor.prototype
复制代码
- js的对象最初都是由Object.prototype对象克隆而来,可是对象构造器的原型能够动态指向其余对象,从而达到继承的效果。
-
实现一个”类“继承另外一个类的效果设计
var A = function(){}
A.prototype = {name:'sven'}
var B = function(){}
B.prototype = new A()
var b = new B()
console.log(b.name)
复制代码
- 尝试遍历b的全部属性,没有找到name
- 将请求委托给b的构造器的原型,它经过b.__ proto __ 指向 B.prototype,B的原型是一个由A构造器创造出来的对象
- 在B的原型中依然没有找到name属性,因而将请求委托给new A()对象的构造器原型 A.prototype
- 在A.prototype中找到name属性,并返回他的值
- 继承老是发生在对象与对象之间
- Object.prototye的原型是null,当请求委托到此却没与找到相应属性时,返回undefined
- 设计模式是对语言不足的补充
- 经过设置构造器原型来实现原型继承时,初根对象Object.prototype自己外,任何对象都会有一个原型。而经过Object.create(null)能够建立出没有原型的对象。(Object.create建立对象的效率不高)
- Es6的class语法,其背后还是经过原型机制建立对象。