Lean JavaScript: Object.create与原型

版权所有,禁止匿名转载;禁止商业使用。

JavaScript对象是基于原型的,而其他多数语言使用的全部都是基于类的对象。


Object.create与原型


开始之前,我们先来看一些代码,我们定义了一个fun对象。


var fun = {
company: 'Phodal',
info: function(name) {
    return this.company + name
}
}

我们分别用 prototype 和 Object.create() 来创建实例。


oc = Object.create(fun) //Object Create
 // Object {company: "Phodal", info: function}
 var p = {};
 p.prototype = fun;
 //p.prototype: Object {company: "Phodal", info: function}
 //p: Object {prototype: Object}

Object.create


我换了家公司。

oc.company = "FENGDA"

没有什么问题,这时原来的公司又来了一个新的man。


fun
 //Object {company: "Phodal", info: function}

fun里面的对象还是原来的对象。


Prototype


我换了家公司。


p.prototype.company = "Fengda"

没有什么问题,这时原来的公司又来了一个新的man。


fun          

 //Object {company: "Fengda", info: function}

问题出现了。


说明


JavaScript不是基于类的语言


JavaScript 并没有真正的“方法”,JavaScript 只有函数,而且任何函数都可以添加到对象上作为对象的属性。继承的函数与其他的属性是基本没有差别的,包括“属性遮蔽”(这种情况相当于其他语言的方法重写)。


当继承的函数被调用时,this 指向的是当前继承原型的对象,而不是继承的函数所在的原型对象。


Object.create()


Object.create() 方法创建一个拥有指定原型和若干个指定属性的对象。


注意:不支持 IE6 , IE7 , IE8 (PS: 你们还在支持低版本IE么? )


不过,对于旧的浏览器可以这样支持


if (!Object.create) {
  Object.create = (function(){
    function F(){}
    return function(o){
      if (arguments.length != 1) {
        throw new Error('Object.create implementation only accepts one parameter.');
      }
      F.prototype = o;
      return new F()
    }
  })()
}


0 0