JavaScript中的函数可以作为对象的实例调用吗?
我最近开始学习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 } 及 谢谢这是一个好问题
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允许您通过实现magicdef\uu调用:
方法来调用类的实例
*:JavaScript中有七种数据类型:
- 布尔值
- 数
- 串
- 空的
- 未定义
- 象征
- 反对
前六种是所谓的“基本”数据类型。我认为JS中的所有内容都是对象。所以任何函数我