版权所有,禁止匿名转载;禁止商业使用。
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() } })() }