如何使用OLOO模式

时间:2016-12-06 22:48:22

标签: javascript inheritance

我正在尝试实现此代码段的继承



function parent(name) {
  this.name = name;

}

function child(childname) {
  parent.call(this, "cde");
  this.childname = childname;
}

var p1 = new parent("abc");
child.prototype = Object.create(parent.prototype);
var p2 = new child("def");

console.log(p1.name);

console.log(p2.name);




使用OLOO模式OLOO pattern

这是我的尝试



function person(name) {
  this.name = name;
}


var p1 = new person("abc");

var p2;

p2 = Object.create(person);

console.log(p2.name);
p2.childname = "def";




在这里创建p2对象时,我不向它发送名称。如何在创建p2对象时向其发送名称。

有人可以解释这是使用OLOO模式实现继承的正确方法

由于

3 个答案:

答案 0 :(得分:5)

这里发布的当前答案都是“正确的”,因为它们适当地应用仅对象原型链接(没有构造函数)。不过我会澄清两点:

  1. 我永远不会推荐属性(或方法)的“阴影”,这意味着让p1p2对象都具有.name属性。这是JS原型中最常见的混淆源之一,即IME。我总是建议在原型链中的每个对象上使用不同的属性名称。

  2. OLOO不仅仅是在不使用构造函数的情况下连接传统的“继承”层次结构,因为OP似乎正在做。这是有效的,但是OLOO的简化视图非常简化。实际上,OLOO旨在以不同于“类”的方式构建模拟软件的能力。 OLOO的目的是让你设置两个对等对象,其中一个可以委托给另一个对象(反之亦然,如果你愿意的话),这样他们就可以在方法的调用时间内进行虚拟编写;又名:行为代表团。有关详细信息,请参阅Chapter 6 of my "YDKJS: this & Object Prototypes" book

答案 1 :(得分:2)

在问题和答案中都存在一些误解,所以我觉得有必要首先澄清一些事情:

  • 在js中引用的模式中没有继承:在OLOO模式中,也在“伪”类对象模式中。原因是继承意味着复制(每次调用构造函数时从类中创建新副本)以及两种模式或使用newObject.create()时都是关于链接 。在您的情况下,您要做的是链接两个对象,以便其中一个作为另一个对象的“后备”(通过[[prototype]]机制)。我再说一遍,这不是继承。
  • 此外,js中没有“构造函数”,只有“构造函数调用”(使用函数+ new编写)...来自this & Object prototypes的第4章Kyle Simpson的You Don't Know JS系列:
  

在上面的代码片段中,人们很容易认为Foo是一个“构造函数”,因为我们用new来调用它,我们发现它“构造”了一个对象。

     

实际上,Foo不再是程序中任何其他函数的“构造函数”。函数本身不是构造函数。但是,当您将new关键字放在普通函数调用之前时,会使该函数调用“构造函数调用”。事实上,新的劫持任何正常的函数,并以构造对象的方式调用它,除了它将要执行的任何其他操作。

  • 此外,没有必要在OLOO模式中使用Object.prototype,因为任何对象通常都会“退回”它,正如您在Kyle Simpson的YDKJS书籍第127页的副本上看到的那样。 enter image description here

最后,这是我的答案(虽然要理解你真正想要达到的目标并不容易......):

// a "parent" object with an "init" function
let Parent = {
    define: function (name) {
        this.name = name;
    }
};
// a child object with another "init" function
let Child = Object.create(Parent);
// different name for init() : useful to differentiate with Parent
Child.create = function (childname) {
    this.define("cde");
    this.childname = childname;

};
let p1 = Object.create(Parent);
p1.define("abc");
let p2 = Object.create(Child);
p2.create("def");
console.log(p1.name);
console.log(p2.name);

答案 2 :(得分:1)

使用OLOO,你会去

var p1 = Object.create(Object.prototype);
p1.name = "abc";

var p2 = Object.create(p1);
p2.name = "cde";
p2.childname = "def";

或者如果您愿意

var p1 = {
   name: "abc"
};

var p2 = Object.assign(Object.create(p1), {
    name: "cde",
    childname: "def"
});

请注意,OLOO绝对不使用构造函数。如果你想避免重复,请使用简单地返回上述表达式的工厂函数,并根据自己的喜好进行参数设置。