prototype:构造函数的真相、原型链
2017-02-12 19:00
120 查看
函数不是构造函数,但是当且仅当使用 new 时,函数调用会变成 ‘构造函数调用’。那么对 ’构造函数‘ 最准确的解释是:所有带 new 的函数调用。 Nothing 只是一个普通的函数,但使用 new 调用时,它会构造一个对象并赋值给 a ,这个对象通过原型链关联着对象 Nothing。 虽然这和传统的‘类继承’很相似,但是 JavaScript 中的机制有一个核心区别,那就是不会进行复制,对象之间是通过内部的 [[prototype]] 链关联的。 因此,相比以‘继承’结尾的术语(‘原型继承’),‘委托’(‘原型委托’)更能表达 JavaScript 的真实机制,因为对象之间的关系不是复制而是委托。
Object.create(..)会创建一个新的对象 myObject 并把它关联到指定的对象 anotherObject,这样就可以充分利用 [[prototype]] 机制并避免不必要的麻烦(比如使用 new 的函数调用会生成.prototype 和 .constructor 引用)。
function Nothing() { console.log( 'Dont mind me' ); } // 会输出 'Dont mind me' var a = new Nothing(); // 输出 {} console.log(a); // 函数不是构造函数,但是当且仅当使用 new 时,函数调用会变成 ‘构造函数调用’。那么对 ’构造函数‘ 最准确的解释是:所有带 new 的函数调用 // Nothing 只是一个普通的函数,但使用 new 调用时,它会构造一个对象并赋值给 a ,这个对象通过原型链关联着对象 Nothing。 // 虽然这和传统的‘类继承’很相似,但是 JavaScript 中的机制有一个核心区别,那就是不会进行复制,对象之间是通过内部的 [[prototype]] 链关联的。 // 因此,相比以‘继承’结尾的术语(‘原型继承’),‘委托’(‘原型委托’)更能表达 JavaScript 的真实机制,因为对象之间的关系不是复制而是委托。 var anotherObject = { cool: function() { console.log( 'cool' ); } }; // Object.create(..)会创建一个新的对象 myObject 并把它关联到指定的对象 anotherObject,这样就可以充分利用 [[prototype]] 机制并避免不必要的麻烦(比如使用 new 的函数调用会生成.prototype 和 .constructor 引用)。 var myObject = Object.create( anotherObject ); // 调用的 myObject.cool() 并不在 myObject 里,这样设计的 API 即不好理解又不容易维护 myObject.cool(); myObject.doCool = function() { // 委托设计模式:通过[[prototype]]委托到 anotherObject.cool() this.cool(); } myObject.doCool();
相关文章推荐
- 原型链,借用构造函数,组合式,寄生式, 寄生组合式
- js 构造函数(construction)与原型(prototype)
- 构造函数中用this和prototype定义属性或函数方法的区别
- 【javascript笔记】关于函数的构造函数和prototype
- C++必知必会之(29)虚构造函数与Prototype模式
- 构造函数 原型prototype 伪类
- JavaScript精炼---类(class)、构造函数(constructor)、原型(prototype)
- 【javascript笔记】关于函数的构造函数和prototype<四>
- javascript_面向对象_轮播图(淡入淡出)_ES3_使用prototype和构造函数
- 构造函数、原型、原型链
- ** Javascript 普通函数和构造函数的区别 && JS----构造函数与原型prototype 区别
- [置顶] ES5 中的面向对象编程前传 之 深刻理解原型链(prototype)
- 原型链的继承都发生在构造函数上
- prototype、__proto__与JavaScript的原型链继承
- 由一道js题探讨构造函数、prototype和__proto__之间的关系
- instanceof的使用: 对象与构造函数在原型链上是否有关系
- js的get set, 构造函数,匿名函数,prototype(原型)
- [JavaScript]构造函数中定义prototype的异常现象及研究
- 详解面向对象、构造函数、原型与原型链
- 构造函数对象[置顶] 揭开Javascript属性constructor/prototype的底层原理