json JavaScript对象究竟是如何工作的?我可以将函数声明为JavaScript对象的字段吗?

mzaanser  于 2023-08-08  发布在  Java
关注(0)|答案(5)|浏览(101)

我是JavaScript的新手,我总是以类似旧的过程方式使用它。
现在我正在研究如何用JavaScript实现面向对象的范例,我对教程中的这个例子有些怀疑。
我有一个utility.js文件,其中包含以下简单代码:

var steveApp = {};  // Object container

steveApp.person = 'Steve';  // Add a person field to the steveApp object

steveApp.logPerson = function() {
    console.log(steveApp.person);
}

字符串
所以我对它到底是如何工作的有些怀疑。
我认为它首先定义了一个名为steveApp空对象

var steveApp = {};  // Object container


然后我认为**.**它是用来向前面的空对象添加字段的,所以我有:

steveApp.person = 'Steve';


将valorized person字段添加到steveApp对象。
最后它做了一件“奇怪”的事:

steveApp.logPerson = function() {
    console.log(steveApp.person);
}


在我看来,向steveApp对象添加一个新字段(名为logPerson),但该字段不是普通字段(整数,字符串或其他对象),而是执行behvavior(在控制台中写入日志)的函数。
然后,在另一个JavaScript中,将其文件化:

steveApp.logPerson();


并且执行先前的功能。那这到底是什么意思这意味着在JavaScript中,一个函数可以是一个对象的字段或其他什么?
为什么要调用这个函数(如果它是真的,它是一个字段)我必须做的:

steveApp.logPerson();


而不调用字段名?:

steveApp.logPerson;

izj3ouym

izj3ouym1#

函数是JavaScript中的第一类对象。它们可以像任何其他类型的数据一样被处理。
你可以将它们存储在变量中,存储在属性中,作为函数参数传递,等等
Abd为什么要调用这个函数(如果它是一个字段)我必须做:
int n. getString();
(zero_or_more_aguments_here)放在作为函数计算的东西后面就是你如何 * 调用 * 一个函数。关闭它们会给你函数本身,而不是调用它的结果。

bvjxkvbb

bvjxkvbb2#

steveApp.logPerson(); //calls the function

字符串
同时

steveApp.logPerson; // returns the function itself (NOT the return value of the function


您也可以在控制台打印它,您将看到:

console.log(steveApp.logPerson())


vs

console.log(steveApp.logPerson);


问候

b4qexyjb

b4qexyjb3#

正如昆汀所提到的&我引用:
函数是JavaScript中的第一类对象。它们可以像任何其他类型的数据一样被处理。
你可以将它们存储在变量中,存储在属性中,作为函数参数传递,等等
另一个需要知道的重要事情是,JS中的对象是通过引用传递或调用的。它们永远不会被复制。

var a = {};
var b = {};
a.test = "hello";
b.test   // returns undefined

字符串
也是

var a = {};
var b = a;
a.test = "hello"
b.test // return "hello"


还有

var stooge = {first: "Jerome", second: "Howard"}
var x = stooge;
x.nickname = "curly";
var nick = stooge.nickname;
nick // returns "Curly"

zbsbpyhn

zbsbpyhn4#

基本的是JavaScript不是强类型的,所以你甚至可以在不同的时间为相同的变量分配不同的类型:

var myVar = true;
myVar = 3.14;
myVar = "now a string";
alert("myVar is now a string with content: " + myVar);
myVar = function (someArg) {
    alert("myVar is now a reference to a function, passed argument " + someArg);
    return true;
}
myVar();

typeof myVar; // would return "function"
typeof myVar(); // would return "boolean"

字符串
至于你的对象“字段”(通常称为属性),实际上它们也可以接收普通变量所能接收的任何类型。包括一个功能,因为他们是“一等公民”。

var myObject = {
    myBool: true,
    myNumber: 3.14,
    myMethod: function (myArg) {
        return myArg;
    },
    myNull: null
};


就像以前一样,你甚至可以在以后重新分配它们...

disbfnqx

disbfnqx5#

你的假设是正确的。但下面两行的区别是

steveApp.logPerson();

字符串
访问logPerson属性并使用()将其作为函数调用

steveApp.logPerson;


它只是访问属性logPerson,如果在RHS中的等式中使用它,则返回引用/值。
如果你考虑像Scala这样的编程语言,它足够智能,可以在不使用()的情况下推断它是否是函数调用,但在JavaScript中,它是引用,如果你试图调用一个普通的属性,而不是函数。你会得到一个错误提示:logPerson is not a function

相关问题