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"关键字通常不被使用,因为它使调试变得困难。