Javascript继承和这个
Javascript Inheritance and this
本文关键字:继承 Javascript 更新时间:2023-09-26
假设我有一个名为ns的命名空间ns必须在其上运行
ns = {};
ns.Foo = function(message, fn){
this.message = message;
fn.call(this);
};
ns.bar = function() {
alert('Hello, world!');
};
我这样称呼它:
var foo = new Foo('My Message', function() {
bar();
});
我得到一个错误说bar()是未定义的。但是如果我这样调用它:
var foo = new Foo('My Message', function() {
this.bar();
});
它的工作原理。有没有一种方法来构建我的JavaScript,这样我就可以调用bar()没有这个?
谢谢!
No。JavaScript不是Java。您需要指定要调用其方法的对象
你所做的可能是解决与闭包。
JavaScript没有名称空间的原生概念。人们已经使用了一些命名空间模式,它们只是在单个对象中定义一个工具集合,这样它们就不会污染全局作用域。当你使用"apply"或"call"时,唯一的区别是你在函数执行时重新绑定了"this"所引用的内容。你不能改变它的父作用域。
由于这些伪名称空间实际上只是普通的对象(而不是作用域),如果不限定它们属于哪个对象,就不能调用它的成员。
如果你使用闭包(它是一个作用域)而不是对象伪命名空间,你可以在闭包内定义的函数中隐式调用闭包的成员。例如:
var ns = {};
(function() {
var Foo = ns.Foo = function(message, fn){
this.message = message;
fn.call(this);
};
var bar = ns.bar = function() {
alert('Hello, world!');
};
var doStuff = ns.doStuff = function() {
var myFoo = new Foo('My Message', function() {
// "this" is unnecessary because bar is defined
// in this scope's closure.
bar();
});
};
})();
var foo = new ns.Foo('My Message', function() {
// Sill need "this" because bar is not defined in the scope
// that this anonymous function is being defined in.
this.bar();
});
你也可以使用"with"关键字,它显式地修改作用域。
var foo = new ns.Foo('My Message', function() {
with (this) {
bar();
}
});
需要注意的是,"with"关键字通常不被使用,因为它使调试变得困难。
相关文章:
- 以jquery方式继承Javascript
- JavaScript对象不是从原型链继承的
- 数据与Javascript中的继承冲突
- JavaScript对象继承问题
- Javascript嵌套函数属性继承
- 从类构造函数继承javascript
- Loaded()内容赢得't继承javascript
- 原型继承JavaScript在不同函数中使用变量
- 通过调用祖先函数继承JavaScript
- 如何从核心OpenERP 6.1继承javascript
- 安全地继承JavaScript中的原型
- 对经典和原型继承Javascript的混淆
- 不同文件中构造函数之间的部分继承(JavaScript)
- TypeScript:如何继承javascript构造函数
- 在c++中继承JavaScript函数
- 我如何继承javascript函数
- 通过__proto__原型来继承JavaScript是否不好
- 原型继承-Javascript原型:替换与添加
- 原型继承 - JavaScript 公开原型属性
- 多重继承 - JavaScript hasOwnProperty