003

来源:互联网 发布:淘宝网店如何转让 编辑:程序博客网 时间:2024/05/18 03:35

下面这段代码使用的就是典型的“原型风格”:

function Foo(name) {    this.name = name;}Foo.prototype.myName = function () {    return this.name;}; function Bar(name, label) {    Foo.call(this, name);    this.label = label;}// 我们创建了一个新的 Bar.prototype 对象并关联到 Foo.prototypeBar.prototype = Object.create(Foo.prototype);// 注意!现在没有 Bar.prototype.constructor 了// 如果你需要这个属性的话可能需要手动修复一下它Bar.prototype.myLabel = function () {    return this.label;};var a = new Bar("a", "obj a");a.myName(); // "a"a.myLabel(); // "obj a"

注意,下面这两种方式是常见的错误做法,实际上它们都存在一些问题:

// 和你想要的机制不一样!Bar.prototype = Foo.prototype;// 基本上满足你的需求,但是可能会产生一些副作用 :(Bar.prototype = new Foo();


我们来对比一下两种把 Bar.prototype 关联到 Foo.prototype 的方法:

// ES6 之前需要抛弃默认的 Bar.prototypeBar.ptototype = Object.create(Foo.prototype);// ES6 开始可以直接修改现有的 Bar.prototypeObject.setPrototypeOf(Bar.prototype, Foo.prototype);

如果忽略掉 Object.create(..) 方法带来的轻微性能损失(抛弃的对象需要进行垃圾回
收),它实际上比 ES6 及其之后的方法更短而且可读性更高。不过无论如何,这是两种完
全不同的语法







原创粉丝点击