首选解决方案
Javascript OOP 特定于上下文处理:如果您的父级使用上下文(this),只需使用其上下文调用子级中的父级(注意new function(),它将上下文从全局设置为新创建的对象):
var parent = function() { // constructor, should be called with new
this.someFunc = function() { return "a string"; }
}
var child = new function() { // object, was already called with new
parent.call(this); // set parent context to child's, don't create new one
var someVal = this.someFunc(); // method from parent.
}
console.log(child.someFunc()); // a string
替代的非标准解决方案,接近您的方法
如果您设置父原型而不是使用其上下文,则可以使用可以访问其原型的非标准成员: __proto__
var parent = function() {} // constructor to create empty object
parent.prototype.someFunc = function() { // someFunc is in parent prototype
return "a string";
}
var child = new function() {
this.__proto__ = new parent(); // set prototype to parent with its own context
var someVal = this.someFunc(); // method from parent.
}
console.log(child.someFunc()); // a string
与您的工作示例相比
您也可以将原型设置为构造函数,而不是使用标准 prototype
的对象。请注意,对象是在设置原型之后创建的,请查看new
调用位置并将其与 Felix Kling 对问题的评论进行比较:
var parent = function() {}
parent.prototype.someFunc = function() {
return "a string";
}
var child = function() { // no new here
var someVal = this.someFunc();
}
child.prototype = new parent();
console.log((new child).someFunc()); // new moved here
错误解释
函数 withnew
从 javascript 中的函数创建构造函数。这意味着上下文成为函数本身。没有new
(并且具有默认的非严格行为),上下文是全局上下文,因此您的错误
Object [object global] has no method 'someFunc'