我正在尝试实现此代码段的继承
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模式实现继承的正确方法
由于
答案 0 :(得分:5)
这里发布的当前答案都是“正确的”,因为它们适当地应用仅对象原型链接(没有构造函数)。不过我会澄清两点:
我永远不会推荐属性(或方法)的“阴影”,这意味着让p1
和p2
对象都具有.name
属性。这是JS原型中最常见的混淆源之一,即IME。我总是建议在原型链中的每个对象上使用不同的属性名称。
OLOO不仅仅是在不使用构造函数的情况下连接传统的“继承”层次结构,因为OP似乎正在做。这是有效的,但是OLOO的简化视图非常简化。实际上,OLOO旨在以不同于“类”的方式构建模拟软件的能力。 OLOO的目的是让你设置两个对等对象,其中一个可以委托给另一个对象(反之亦然,如果你愿意的话),这样他们就可以在方法的调用时间内进行虚拟编写;又名:行为代表团。有关详细信息,请参阅Chapter 6 of my "YDKJS: this & Object Prototypes" book。
答案 1 :(得分:2)
在问题和答案中都存在一些误解,所以我觉得有必要首先澄清一些事情:
new
或Object.create()
时都是关于链接 。在您的情况下,您要做的是链接两个对象,以便其中一个作为另一个对象的“后备”(通过[[prototype]]
机制)。我再说一遍,这不是继承。在上面的代码片段中,人们很容易认为Foo是一个“构造函数”,因为我们用new来调用它,我们发现它“构造”了一个对象。
实际上,Foo不再是程序中任何其他函数的“构造函数”。函数本身不是构造函数。但是,当您将new关键字放在普通函数调用之前时,会使该函数调用“构造函数调用”。事实上,新的劫持任何正常的函数,并以构造对象的方式调用它,除了它将要执行的任何其他操作。
最后,这是我的答案(虽然要理解你真正想要达到的目标并不容易......):
// 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绝对不使用构造函数。如果你想避免重复,请使用简单地返回上述表达式的工厂函数,并根据自己的喜好进行参数设置。