我们使用名为TestComplete的工具编写了大量JavaScript代码来运行我们的自动化测试。在某些情况下,我使用以下语法设置了继承树:
function Parent()
{
...
//some inline code here executes on object creation
}
Child.prototype = Parent;
Child.prototype.constructor = Child;
function Child()
{
Parent.call(this);
...
}
我使用
的原因Child.prototype = Parent;
而不是
Child.prototype = new Parent();
是因为在某些情况下,在父级中创建新对象时会执行代码。以这种方式设置原型从来就不是问题,因为我总是能够在创建Child之后调用Parent中定义的所有函数。
但是,我怀疑,实际上我已经打破了原型链,并且我已经通过以下事实得到了保存:我们定义的所有方法都是内联定义的(即在构造函数内部)并且不使用对象.prototype.method = ...语法,所以链被破坏的事实没有被注意到。所以我有两个问题;我打破了链条,在JavaScript中打破原型链的副作用是什么?
答案 0 :(得分:2)
当你“破坏”这样的原型链时,你无法访问Parent.prototype.*
个实例中的Child
方法和属性,instanceof
运算符不起作用(new Child() instanceof Parent === false
)
我理解为什么您不想使用new
关键字进行继承。但是,在没有执行父构造函数的情况下继承父进程的原型有一点小技巧:
var Parent = function () { ... };
var Child = function () {
Parent.call(this);
...
};
var Fn = function () {};
Fn.prototype = Parent.prototype;
Child.prototype = new Fn();
Child.prototype.constructor = Child;
答案 1 :(得分:0)
好的,此代码将为您运行并允许访问原型。它涉及使父对象成为对象,你可以在你孩子的“构造函数”中调用原型方法
var Parent = {
testMethod1 : function() {
alert('testMethod1');
}
}
Parent.testMethod2 = function() {alert('testMethod2');}
Child.prototype = Parent;
//Child.prototype.constructor = Child;
function Child()
{
alert('im ready');
Child.prototype.testMethod1();
}
var child1 = new Child();
child1.testMethod1();
child1.testMethod2();
Parent.testMethod3 = function() {alert('testMethod3');}
child1.testMethod3();
如果您想取消'新',可以使用Object.create()
var Parent = {
testMethod1 : function() {
alert('testMethod1');
}
}
Parent.testMethod2 = function() {alert('testMethod2');}
var child1 = Object.create(Parent);
child1.testMethod1();
child1.testMethod2();
Parent.testMethod3 = function() {alert('testMethod3');}
child1.testMethod3();
Object.create = function (o) {
function F() {}
F.prototype = o;
return new F();
};
在第二种情况下,你需要在创建()对象后调用一个函数作为你的“构造函数”,但这是真正的原型继承。