我对javascript变量继承有疑问。
我正在尝试创建一个小型库,但我无法将一些变量推送到子库中。
首先,我创建了根函数:
function myLibrary(param) {
this.param = param
}
以后我想扩展它,但是在模块中,所以我创建了第一个,并希望从param
根获得myLibrary
,但它没有工作:
myLibrary.prototype.myModule = {
test: function() {
console.log(this.param) // doesn't work - logs "unknown"
}
}
有什么方法可以让它发挥作用吗?就像我打电话的方式一样
myLibrary("foo").myModule.test();
并且foo
被记录了?
感谢您的帮助。
答案 0 :(得分:2)
在匿名函数中为this
分配字段时,您将分配给窗口对象。要使用原型继承,请将您的函数用作new
关键字的构造函数,或手动分配__proto__
字段。
此外,由于它位于单独的对象上,因此您无法让test
识别正确的上下文。
所以,不要改变你的电话。我改变了你的图书馆建立自己的方式"并使用封装而不是类。
function myLibrary(param) {
var mylib = {};
mylib.myModule = {
test: function(){
console.log(param);
}
};
return mylib;
}
myLibrary("foo").myModule.test(); // logs foo

这是一种非常常见的模式,并且会定期使用。
但是,如果你开始使用继承,那么在JavaScript中查找类。
答案 1 :(得分:2)
你有3种方式: 1 - 在原型上创建方法:
myLibrary.prototype.test = function() {
console.log(this.param)
}
new myLibrary("foo").test();
2 - 从头开始创建原型:
myLibrary.prototype = {
test: function() {
console.log(this.param)
}
}
new myLibrary("foo").test();
3 - 或者说本杰明在答案中写道 - 实施module模式。
答案 2 :(得分:0)
您可以进行如下更改
myLibrary.prototype.myModule = (function(){
var _private = this.param;
return {
test: function() {
console.log(_private) // will work
}};
})();
调用测试功能如下:
new myLibrary("foo").myModule.test();
答案 3 :(得分:0)
我们可以创建一个闭包,请参考:
function MyLibrary(param) {// Please make sure that constructor
// name starts with capital.
this.param = param;
}
MyLibrary.prototype.myModule = function(){
var newParam = this.param; //free variable
test = function() { //closed function
console.log(newParam)
}
return test;
}
var myLibrary = new MyLibrary("foo"); //creating new library object
var test = myLibrary.myModule(); //taking method returned by
//myModule
test();//invoking it.