JavaScript原型——对象关联
来源:互联网 发布:星际战甲腐蚀投射数据 编辑:程序博客网 时间:2024/05/29 09:07
检查“类”关系
在Java这些面向类的语言中,检查一个实例的继承祖先叫做反射。在JavaScript里面,怎么检查对象的委托关联呢?
function Foo() { //...}var a =new Foo();
如何通过反射找出a的祖先(委托关联)呢?
a instanceof Foo; //true
instanceof回答的问题是:在a的整条[[Prototype]]链中是否有指向Foo.prototype的对象。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接口设计更加清晰!
- JavaScript原型——对象关联
- 《JavaScript高级程序设计》——原型对象、原型链
- 《JavaScript》——面向对象之原型
- 《JavaScript》——面向对象之原型
- JavaScript创建对象 —— 原型模式
- JavaScript中的对象(二)——原型对象
- JavaScript——对象属性、创建对象、继承、原型链
- javascript 高级——prototyp对象(中)原型的赋值
- 【JavaScript】——剖析面向对象与原型(一)
- 【JavaScript基础知识】——面向对象和原型
- 【JavaScript】——面向对象之原型优化
- Javascript——面向对象与原型(操作指南)
- Javascript面向对象(三)——原型继承
- Javascript面向对象(四)——函数原型
- Javascript面向对象(五)——内置原型
- Javascript面向对象(六)——方法原型
- javascript面向对象——prototype属性(原型属性)
- JavaScript原型对象、原型属性、原型链
- Redis的安全性及客户端工具的使用
- 使用POI导出Excel表
- 将一个用myeclipse编写的完整的文件导入javaee编译器中的工程项目中
- ACM训练周末总结—10月29日
- win10 + python27 + selenium + pillow 开发环境搭建 重新安装pilloow
- JavaScript原型——对象关联
- Jensen不等式的证明
- 栅栏染色-LintCode
- 正则表达式
- 第三讲 类的验证,准备,解析和初始化
- Java 基础知识
- An Intuitive Explanation of Convolutional Neural Networks
- 系统引导方式GRUB的详细介绍
- 用python实现PAT1057数零壹