vik*_*ant 54 javascript prototype
考虑这个功能:
function Foo(){
var a = "3";
};
Run Code Online (Sandbox Code Playgroud)
根据__proto__ VS. JavaScript中的原型,
Foo.__proto__ = Function.prototype
Function.prototype.__proto__ = Object.prototype
Run Code Online (Sandbox Code Playgroud)
我理解了这一部分,但如果我在Google Chrome控制台中执行此操作:
Object.__proto__
output: ƒ () { /* native code */ }
Function.__proto__
output: ƒ () { /* native code */ }
Run Code Online (Sandbox Code Playgroud)
Q1:他们为什么指向功能?它们实际上是什么Function以及Object它们如何彼此不同,因为Object实际上是一个函数?:
typeof Object
"function"
Run Code Online (Sandbox Code Playgroud)
Q2:如果一切都是JavaScript中的对象,那为什么是Object函数?另外,如何在JavaScript中实际实现一个函数?在函数内声明的变量会发生什么?函数是否由JavaScript编译器转换为对象?
对不起,如果我错过了一些明显的事 我真的很困惑函数和对象在JavaScript中的实现方式.
Tii*_*iJ7 66
您似乎在"对象"(数据结构)和Object(函数)之间感到困惑.
对象是JavaScript中的一个概念,它是某些数据的通用容器.对象包含具有键和关联值的属性.
在JavaScript中,所有非基元的东西都是对象.这包括函数,它们基本上是一种可以用()语法"调用"的特殊类型的对象.
JavaScript提供了许多具有各种用途的内置函数.两个这样的功能,碰巧被称为Object和Function.因此换句话说,它Object是一个函数,因此也是一个"对象"(数据结构).
我们以您的函数Foo为例:
function Foo() {
var a = "3";
}
Run Code Online (Sandbox Code Playgroud)
Foo是一个功能.这意味着Foo可以调用,例如.var f = Foo().在这种情况下f会undefined因为Foo不返回任何东西.
因为Foo是一个函数,它也是一个对象.这意味着我们还可以添加和读取它的属性:
Foo.bar = 5;
Foo.bar++;
console.log(Foo.bar); // prints 6
Run Code Online (Sandbox Code Playgroud)
请注意,此"对象"部分Foo与功能的内容无关.这意味着你声明的代码(var a = "3")是无关紧要的.您无法var a以任何方式访问此处,因为在您调用该函数之前它不存在.如果你这样做Foo.a,你就不会var a在函数内部操纵; 您正在使用a该对象上的属性Foo.
但是,你可以反过来这样做并访问Foo函数内部的属性:
function Foo() {
var a = "3"; // a is local to this scope, you cannot get to it from outside
console.log(a); // prints 3 - local variable a is accessible inside the scope of this function
console.log(Foo.a); // prints 5 - a is a property on object Foo, and is accessible here
}
// var a inside Foo cannot be accessed here
Foo.a = 5;
Foo();
Run Code Online (Sandbox Code Playgroud)
编辑:重新.您在评论中关于"this"的问题.this是JavaScript中一个引用对象的特殊关键字.但是,此对象不是函数本身,它是使用new关键字调用函数时创建的新对象:
function Bar() {
this.a = 10;
console.log(this == Bar); // prints false
}
var bar = new Bar();
console.log(bar.a); // prints 10
Run Code Online (Sandbox Code Playgroud)
用new关键字调用的函数称为"构造函数".Object并且Function都是构造函数的示例,这就是为什么它们的名称以大写字母开头(JavaScript中的约定).
使用构造函数创建对象时prototype,此函数的属性将用作__proto__创建对象的原型(可通过).
console.log(bar.constructor == Bar) // prints true
console.log(bar.__proto__ == Bar.prototype) // prints true
Run Code Online (Sandbox Code Playgroud)
this 也用于其他事情,但这是一个广泛的主题和超出这个问题的范围.
Nab*_*hid 15
Function和Object都是构造函数,它们可以分别用于创建函数和对象,这就是typeof Function返回的原因function.
关于对象和函数之间的异同,请考虑以下几点:
可以使用()运算符调用函数,因为JavaScript引擎知道它是使用函数关键字声明的并且具有可执行代码.因此,无论何时调用它,JavaScript引擎都会创建一个新的执行上下文并设置this绑定,然后执行该函数.当您尝试调用对象而不是抛出错误,即"不是函数"时,这些都不会发生.
所以我们可以说并非每个对象都是函数,因为它们可能没有使用function关键字声明,也没有可执行代码.
()因为它没有可执行代码,并且未使用function关键字声明.相反,它使用new Object()或对象表示法声明,并包含方法和属性.我希望它能清除这两个问题.
zma*_*mag 11
Q1:他们为什么指向功能?
A1:因为它们是功能.Function并且Object只是构造函数.
功能是一个Function object.对象是一个Object object.
Q2:如果一切都是JavaScript中的对象,那为什么是Object函数?
A2:因为Object它只是一个构造函数.
typeof Object
// 'function'
typeof new Object()
// 'object'
Run Code Online (Sandbox Code Playgroud)
函数是一个实例Function,因此使函数成为一个对象.
(function(){}) instanceof Function
// true
Run Code Online (Sandbox Code Playgroud)
从根本上
Functions有一些可以执行的代码.
Object是包含数据的那些.
对于Point有x和的班级y.
class Point {
constructor(x, y) {
this.x = x;
this.y = y;
}
isOrigin() { return x == 0 && y == 0; }
}
let p = new Point();
Run Code Online (Sandbox Code Playgroud)
答案1
在此,p是object包含数据或其它功能.
p.isOrigin 是功能.
类似地,类Point本身是一个function其中当运行产生p.这就是为什么所有的类都Object和Functions有functions更精确constructor functions.
答案2
如果一切都是JavaScript中的对象,那么为什么是
Object函数?
与答案1相同.
另外,如何在JavaScript中实际实现一个函数?
不同的JavaScript引擎将有不同的实现.他们有他们需要遵循的规范.
在函数内声明的变量会发生什么?
无关.每次function运行的范围都包含该功能的所有数据.
函数是否由JavaScript编译器转换为对象?
不知道你在问什么.
ECMAScript参考非常适合回答此类问题。
因此,要回答您的问题:Foo只能是对象(因为菜单上的所有其他内容都是基本值类型)。因此,Foo()是一种特殊的语法,它仅调用该Call对象的内部方法。但是Foo它本身就是一个对象,您可以使用它来处理其他任何对象,包括在对象上设置任意属性。
在对象上定义方法仅表示存在具有该名称的属性,并且该属性引用了一个对象,该对象恰好是“功能对象”。
同样,可以用作构造函数的只是一个碰巧具有Construct内部方法的对象,以及调用它的语法糖。
如您所知,JavaScript中没有类,它是一种基于原型的面向对象的语言(就您所知,它是面向对象的,从字面上看,它什么也没有)。因此,任何一种“原型”都只是对象之间的链接。构造函数方法(如上面给出的链接解释)只是简单地调用与它被调用对象的构造方法(即类似String)作为参数,就像语言会打电话Call与this作为对象的方法被调用上。
Object是所有对象的构造函数。所以,typeof Object==="function"
这是可视化的代码段:
console.log(typeof Object) //function (which is an object)
var object=new Object() //An instance of Object 'class'
console.log(typeof object) //object
console.log(object instanceof Object) //true, because object is created by Object()Run Code Online (Sandbox Code Playgroud)
Function是所有函数的构造函数(包括自身...)
因此,尽管不是所有的东西都是一个函数,但是大多数大写的本机标识符都引用一个构造函数。
| 归档时间: |
|
| 查看次数: |
4520 次 |
| 最近记录: |