昨天看了一本书《你不知道的javascript(上)》关于这方面的内容,体会颇深,其中书中讲到的把javascript当作是面向委托的语言比面向对象的解释更加贴切,下面我就简单结合自己的理解,书写阐述一下,也可以作为一种笔记记录。
MDN
ES5之前Object.create Poyfill代码: if(!Object.create){ Object.create = function(o){ function F(){}; F.prototype = 0; return new F(); //new的作用参见上述 第二种方式 } } ES5:“Object.setPrototypeOf(Bar.prototype,Foo.prototype)“更加标准可靠OO:类的继承是复制行为,简单说关系是父子关系 OLOO: 只是对象的关联(基于原型/原型链),简单说关系是兄弟关系,互相关联。
代码 OO风格:
function Foo(who){ this.name = who; } Foo.prototype.identity = function(){ return "I am "+this.name; }; function Bar(who){ Foo.call(this,who); } Bar.prototype = Object.create(Foo.prototype); Bar.prototype.speak = function(){ alert("hello,"+this.identity()+" ."); }; var b1 = new Bar('b1'); var b2 = new Bar('b2'); b1.speak(); b2.speak();OLOO风格:
Foo = { init: function(who) { this.name = who; }, identity: function() { return "I am " + this.name; } }; Bar = Object.create(Foo); Bar.speak = function() { alert("hello," + this.identity() + " ."); }; var b1 = Object.create(Bar); b1.init('b1'); var b2 = Object.create(Bar); b2.init('b2'); b1.speak(); b2.speak();内省:我们想看Foo和Bar之间的关系 OO:对比的是Bar.prototype与Foo的关系,并不是Bar和Foo的关系
console.log(Bar.prototype instanceof Foo); //true console.log(Object.getPrototypeOf(Bar.prototype) === Foo.prototype);//true console.log(Foo.prototype.isPrototypeOf(Bar.prototype));//trueOLOO:是Bar和Foo的关系
console.log(Object.getPrototypeOf(Bar) === Foo); console.log(Foo.isPrototypeOf(Bar));