Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/388.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_Ecmascript 6_Javascript Objects_Prototypal Inheritance - Fatal编程技术网

JavaScript中的函数可以作为对象的实例调用吗?

JavaScript中的函数可以作为对象的实例调用吗?,javascript,ecmascript-6,javascript-objects,prototypal-inheritance,Javascript,Ecmascript 6,Javascript Objects,Prototypal Inheritance,我最近开始学习JavaScript,当我学习prototype概念时,我真的很困惑。我读到的和理解的一切都被弄糊涂了 让我们直接过去吧 我有两个关于函数和对象的问题 问题1: JS中的函数可以有(键、值)对属性吗?如果是这样,您可以告诉我密钥的数据类型是什么?因为在对象中,属性的键只能是字符串、对象以及在某些特殊情况下的符号类型 问题2: 如何对这些功能进行内部评估?它们是否转换为对象 function sample () { // code goes here } 及 谢谢这是一个好问题

我最近开始学习JavaScript,当我学习
prototype
概念时,我真的很困惑。我读到的和理解的一切都被弄糊涂了

让我们直接过去吧

我有两个关于函数和对象的问题

问题1:

JS中的函数可以有(键、值)对属性吗?如果是这样,您可以告诉我密钥的数据类型是什么?因为在对象中,
属性
只能是
字符串
对象
以及在某些特殊情况下的
符号
类型

问题2:

如何对这些功能进行内部评估?它们是否转换为对象

function sample () {
  // code goes here
}


谢谢

这是一个好问题,可能会让很多人困惑。首先是javascript中构造函数和原型的概念 所以

现在A也有一个原型

console.log("Aprototype", A.prototype) 
那将是一个目标 该本机对象具有属性proto

console.log(A.prototype.__proto__)
这将是父原型。从中继承当前原型。这个父原型还将有一个构造函数,即您的函数构造函数

console.log("parentConstructor", A.prototype.__proto__.constructor)
console.log("parent parent __proto__", A.prototype.__proto__.__proto__)
现在,这个父Protype还有一个proto,它链接到对象函数构造函数

console.log("parentConstructor", A.prototype.__proto__.constructor)
console.log("parent parent __proto__", A.prototype.__proto__.__proto__)
它的构造函数是你的对象构造函数

这就是为什么你能得到新的物体

var t = new Object()
看看我们如何把它叫做构造函数


这就是原型javascript的用法:)

您可以随意向函数添加属性,因为在javascript中,函数是对象。在为创建函数提供的两种语法中,您都会得到一个(function)对象

添加属性的示例:

函数计数器(){
console.log(++counter.count);
}
counter.count=0;//在函数对象上创建属性
//多次调用该函数
计数器();
计数器();

计数器()我最好的建议是跳入Chrome控制台并在那里玩。把砖块放在他们的位置上真是个好方法

JS中的函数可以有(键、值)对属性吗?如果是,, 您可以告诉我密钥的数据类型是什么?因为在一个对象中,键 在某些情况下,属性的类型只能是字符串、对象和 特殊情况符号

当然可以。但你们误解了物体是钥匙。您可以这样做:

var obj = {};
var key = {};
obj[key] = "Smthg";
但这会起作用,因为
会被字符串化。因此,
obj[key]
将转换为
obj[“[object object]”]
。测试一下:

var obj={};
var key={};
obj[键]=“键1”;
obj[“[对象]”]=“键2”;

console.log(obj[key])对问题1的回答:

是的,在函数中可以有key:value对,但该函数称为
构造函数
。例如:

function Car(make, model, year) {
   this.make = make;
   this.model = model;
   this.year = year;
}
在ES6中:您可以使用
constructor()
函数在类中存储类似的key:value对。例如:

 constructor(make, modal, year) { // constructor syntactic sugar
   this.make = make;
   this.model = model;
   this.year = year;
}
键的数据类型取决于存储在该
键中的值的类型。在我们的示例中,如果我将字符串值存储在
this.model
中,则模型键的数据类型将是字符串,如果我将年份存储为数字,则
this.year
的数据类型将是
number


对问题2的回答

要了解函数在内部的工作方式,您需要了解执行上下文。要理解执行上下文,您必须阅读本文。简而言之:

每次调用函数时,都会创建一个新的执行上下文。但是,在JavaScript解释器中,对执行上下文的每个调用都有两个阶段:

创作阶段

[调用函数时,但在执行之前 创建范围链。创建变量、函数 和争论。确定“this”的值

激活/代码

执行阶段:赋值、函数引用和解释 /执行代码


似乎你的总体问题是“什么是功能”

是的,函数是对象*。这就是为什么他们是一流公民的原因。它们就像其他任何价值一样。与其他对象一样,它们也可以具有属性(您可能熟悉
f.call
f.bind
等)

函数与其他对象的区别在于它们有一个内部
[[Call]]]
属性(内部属性不能从用户代码访问,它们在规范中用于定义对象的内部状态/行为)

[[Call]]
属性包含函数体中代码的一些表示形式。调用函数时执行的就是这段代码

函数工作还需要其他内部属性,但
[[Call]]
是最重要的属性。它用于确定对象是否可调用

原型主要与功能无关。原型是一个应用于一般对象的概念。它们也不是很复杂:原型只是一个对象。使一个对象成为原型的原因是另一个对象通过其内部
[[prototype]]
属性对其进行引用。然后我们可以说“这个物体是另一个物体的原型”


其他语言的工作方式也类似。例如,Python允许您通过实现magic
def\uu调用:
方法来调用类的实例


*:JavaScript中有七种数据类型:

  • 布尔值
  • 空的
  • 未定义
  • 象征
  • 反对

前六种是所谓的“基本”数据类型。

我认为JS中的所有内容都是对象。所以任何函数我