Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/406.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 对象文字和静态变量_Javascript - Fatal编程技术网

Javascript 对象文字和静态变量

Javascript 对象文字和静态变量,javascript,Javascript,对象文字被视为静态对象 因此,对象文字应该只包含静态变量,但在下面的代码段中 var obj = { a : "hello", foo : function(){ console.log(this.a); console.log(obj.a); } }; 我可以以静态方式obj.a和非静态方式this.a访问a a是一个静态变量吗?obj.a是“静态的”,即您对它的引用方式。在使用new obj()时,您只能以这种方式使用this——因此

对象文字被视为静态对象

因此,对象文字应该只包含静态变量,但在下面的代码段中

var obj = {
    a : "hello",
    foo : function(){
        console.log(this.a);
        console.log(obj.a);
    }
};
我可以以静态方式
obj.a
和非静态方式
this.a
访问
a

a
是一个静态变量吗?

obj.a
是“静态的”,即您对它的引用方式。在使用
new obj()
时,您只能以这种方式使用
this
——因此
obj
必须是一个函数

默认情况下,
当在作为对象成员的函数中使用时,此
引用父对象。在代码的情况下,
obj
是父对象

使用原型和
的示例:

var Obj = function(){this.a = "hi"};
Obj.prototype.foo = function(){
    console.log(this.a);
}
Obj.b = "sth";
var myObj = new Obj();
myObj.foo(); // "hi"
console.log(myObj.b); // undefined

object literal不是一个静态类,它是object的一个实例;因此,
obj.a
也不能是静态的。也许混淆之处在于
{}
符号实际上创建了一个对象:

typeof {
    a : "hello",
    foo : function(){
        console.log(this.a);
        console.log(obj.a);
    }
};

"object"
这相当于:

var obj = new Object();
obj.a = 'hello';
obj.foo = function() {}
结论


静态属性只有在面向类的语言中才有意义,但是JavaScript中的类的相同概念可以说是不存在的。

我认为您混淆了许多不同的东西

您已经创建了一个名为
obj
的对象,该对象的字段名为
a
。该字段可以作为
obj.a
(或者
obj['a']
访问,如果您愿意的话)。如果您安排其他变量引用
obj
,那么也可以通过该变量使用该变量

安排其他变量指向
obj
的一种方法是获取定义为函数/闭包的
obj
字段,并使用“方法”语法调用它,如
obj.foo()
中所述。这意味着在
foo
的主体内,在调用期间,特殊变量
this
将引用
obj
。因此,该函数中的代码可以通过
this.a
访问
obj.a


所有这些都与静态范围与动态范围、单例、或“类”与“实例”成员或任何其他成员无关。它只是一个对象。

这并不是那么简单,请检查

 let baba = {
    a: 12,
    foo: function () {
        baba.a = 13;
        this.a = 14;
    },
    roo: function () {
        alert("baba.a = " + baba.a + "\nthis.a = " + this.a);
    }
};
var theApp = {
    start_action: function () {

        let sola = Object.create(baba);
        sola.foo();
        sola.roo();

        let bola = Object.create(baba);
        bola.roo();            
    }
}
$(document).ready(theApp.start_action);
在roo()调用之后对foo的第一次调用:13,14
第二次调用foo 13,13

“对象文字被视为静态对象”。真的吗?在大多数语言中,静态变量都可以通过
Type.var
this.var
引用。能够使用
this.var
进行引用并不能使它成为非静态的。@bfavaretto它的行为像单例一样吗?您不能执行var b=new obj();JavaScript中没有静态变量。抛开所有你从java或任何你所学的语言中了解的东西,学习JavaScript——这经常被误解,但如果你花时间去了解它的原型性质,你会惊讶于它的强大,尽管它有几个“缺点”就经典思维而言,更重要的是,你可以做一些类似于
var func=obj.foo
的事情,打破
这个
参考!