JavaScript原型——对象关联

检查“类”关系

在Java这些面向类的语言中,检查一个实例的继承祖先叫做反射。在JavaScript里面,怎么检查对象的委托关联呢?

function Foo() {
    //...
}

var a =new Foo();

如何通过反射找出a的祖先(委托关联)呢?

  1. a instanceof Foo; //true
    instanceof回答的问题是:在a的整条[[Prototype]]链中是否有指向Foo.prototype的对象。

  2. Foo.prototype.isPrototypeOf(a); //true
    isPrototypeOf()回答的问题是:Foo.prototype是否出现在a的整条[[Prototype]]链中。


对象关联

[[Prototype]]机制就是存在于对象中的一个内部链接,它会引用其他对象。

该链接的作用:如果在对象上没有找到需要的属性或者方法引用,引擎就会继续在[[Prototype]]关联的对象上进行查找。同理,如果在后者中也没有找到需要的引用就会继续查找它的[[Prototype]],以此类推。这一系列对象的链接被称为“原型链”。

[[Prototype]]机制的意义
var foo = {
    something: function() {
        console.log("something");
    }
};

var bar = Object.create(foo);

bar.something();    //something

我们不需要来创建两个对象之间的关系,只需要通过委托来关联对象。Object.create()会创建一个新对象(bar)并把它关联到我们指定的对象(foo),这样既可以委托又避免了不惜要的麻烦(比如使用new的构造函数调用会生成.prototype和.constructor引用)。


注意
思考下面代码:

var anotherObject = {
    cool: function() {
        console.log("cool!");
    }
}

var myObject = Object.create(anotherObject);

myObject.cool();    //cool!

myObject没有cool()方法,但是关联到了anotherObject,所以可以输出。别人看你的代码的话就会很奇怪,在维护的时候就会变得头大了吧?
可以考虑下面这样的改进办法:

var anotherObject = {
    cool: function() {
        console.log("cool!");
    }
}

var myObject = Object.create(anotherObject);

myObject.doCool = function() {
    this.cool();    //内部委托!
}

myObject.doCool();  //cool!

我们调用的doCool()是存在于myObject中的,这样我们的API设计就清晰了。从内部来说,我们的实现遵循的是委托设计模式,通过[[Prototype]]委托到anotherObject.cool().
内部委托比起直接委托可以让API接口设计更加清晰!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值