`Object`는 JavaScript의 함수입니까?
이 기능을 고려하십시오.
function Foo(){
var a = "3";
};
__proto__ VS 에 따르면 . JavaScript의 프로토 타입 ,
Foo.__proto__ = Function.prototype
Function.prototype.__proto__ = Object.prototype
그 부분을 이해했지만 Google Chrome 콘솔에서이 작업을 수행하면 :
Object.__proto__
output: ƒ () { /* native code */ }
Function.__proto__
output: ƒ () { /* native code */ }
Q1 : 그들은 왜 기능을 가리키는가? 무엇 실제로 Function
하고 Object
하기 때문에 어떻게 서로 그들은 다른 객체는 실제로 함수 ?
typeof Object
"function"
Q2 : 모든 것이 자바 스크립트에서 객체라면 왜 Object
함수가 되나요? 또한 함수는 실제로 JavaScript 내부에서 어떻게 구현됩니까? 함수 내에서 선언 된 변수는 어떻게됩니까? JavaScript 컴파일러에 의해 함수가 객체로 변환됩니까?
명백한 것을 놓친다면 죄송합니다. JavaScript에서 함수와 객체가 구현되는 방식에 대해 정말 혼란 스럽습니다.
"객체"(데이터 구조)와 Object
(함수)를 혼동하는 것 같습니다 .
객체는 일부 데이터에 대한 일반 컨테이너 인 JavaScript의 개념입니다. 개체에는 키 및 관련 값이있는 속성이 포함됩니다.
JavaScript에서 원시 가 아닌 모든 것은 객체입니다. 여기에는 기본적으로 ()
구문 으로 "호출"할 수있는 특수한 유형의 객체 인 함수가 포함됩니다 .
JavaScript는 다양한 목적을 가진 여러 내장 함수를 제공합니다. 이러한 두 가지 함수가 호출 Object
되고 Function
. 즉 Object
, 함수이고 따라서 "객체"(데이터 구조)이기도합니다.
함수 Foo
를 예로 들어 보겠습니다.
function Foo() {
var a = "3";
}
Foo
함수입니다. 이것은 Foo
예를 들어 호출 될 수 있음을 의미합니다 . var f = Foo()
. 이 경우 f
는 아무것도 반환하지 않기 undefined
때문 Foo
입니다.
Foo
함수 이기 때문에 또한 객체입니다. 즉, 속성을 추가하고 읽을 수도 있습니다.
Foo.bar = 5;
Foo.bar++;
console.log(Foo.bar); // prints 6
의이 "객체"부분은 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();
편집 : Re. 의견에 "이"에 대한 귀하의 질문. this
객체를 참조하는 JavaScript의 특수 키워드입니다. 그러나이 객체는 함수 자체 가 아니라new
키워드를 사용하여 함수를 호출 할 때 생성되는 새 객체입니다 .
function Bar() {
this.a = 10;
console.log(this == Bar); // prints false
}
var bar = new Bar();
console.log(bar.a); // prints 10
new
키워드 로 호출되는 함수를 "생성자 함수"라고합니다. Object
그리고 Function
그들의 이름은 대문자 (자바 스크립트 대회)로 시작하는 이유는 생성자 함수의 두 가지 예입니다.
생성자 함수를 사용하여 객체를 생성 할 때이 함수의 속성 prototype
은 __proto__
생성 된 객체 의 프로토 타입 (를 통해 액세스 가능 )으로 사용됩니다 .
console.log(bar.constructor == Bar) // prints true
console.log(bar.__proto__ == Bar.prototype) // prints true
this
다른 것들에도 사용되지만 이것은 광범위한 주제이며이 질문의 범위를 벗어납니다.
기능 및 개체 이유이다 각각 기능 개체, 생성 할 수있다 모두 생성자 함수이다 typeof Function
복귀 function
.
자바 스크립트에서 함수와 객체가 어떻게 관련되는지에 대해서는 다음 사항을 고려하십시오.
- 기본이 아닌 모든 유형은 JavaScript의 객체입니다.
- 모든 객체는 Object.prototype에서 직접 또는 간접적으로 상속합니다 (프로토 타입이 setPrototypeOf를 사용하여 명시 적으로 변경되지 않는 한).
- 모든 네이티브 함수는 Object.prototype에서 상속 된 Function.prototype에서 상속되므로 JavaScript에서는 함수가 객체로 취급되므로 함수가 Object.prototype에서 간접적으로 상속됨을 의미합니다.
- 함수가 객체로 취급되는 이유는 다른 함수에 매개 변수로 전달 될 수 있고 함수, 즉 고차 함수 (JavaScript의 강력한 기능)에서 반환 될 수 있기 때문입니다.
()
JavaScript 엔진은 함수 키워드를 사용하여 선언되고 실행 코드가 있음을 알고 있으므로 연산자를 사용하여 함수를 호출 할 수 있습니다 . 따라서 호출 될 때마다 JavaScript 엔진은 새 실행 컨텍스트를 만들고this
바인딩을 설정 한 다음 함수를 실행합니다. 대신 개체를 호출하려고하면 "함수가 아닙니다"라는 오류가 발생하지 않습니다.So we can say that not every object is a function because they may have not been declared using the function keyword and not have executable code.
- As the function is treated as an object in JavaScript, we can add properties to it, create new objects from it.
- A non-function type object cannot be called using
()
because it does not have executable code and is not declared using the function keyword. Instead, it is declared usingnew Object()
or object notation and contains methods and properties.
I hope it clears both questions.
Q1: Why are they pointing to Function?
A1: Because they are functions. Function
and Object
are just constructor functions.
function is a Function object
. object is an Object object
.
Q2: If everything is an object in JavaScript, then why is Object
a function?
A2: Because Object
is just a constructor function.
typeof Object
// 'function'
typeof new Object()
// 'object'
And a function is an instance of Function
, so that makes a function an object.
(function(){}) instanceof Function
// true
Fundamentally
Functions
has some code that can be executed.
Object
are those which contains data.
For class Point
having x
and y
.
class Point {
constructor(x, y) {
this.x = x;
this.y = y;
}
isOrigin() { return x == 0 && y == 0; }
}
let p = new Point();
Answer 1
In this, p
is object
which contains data or other functions.
p.isOrigin
is function.
Similarly, class Point
is itself a function
which when runs produces p
. That's why all classes like Object
and Functions
are functions
more precisely constructor functions
.
Answer 2
If everything is an object in JavaScript, then why is
Object
a function?
Same as Answer 1.
Also, how is a function actually implemented inside JavaScript?
Different JavaScript engines will have different implementations. They have specifications which they need to follow.
What happens to the variables declared inside a function?
Off topic. Every function
runs with a scope which holds all data for that functions.
Is a function converted into an object by the JavaScript compiler?
Not sure what are you asking.
The ECMAScript reference is very nice for answering such questions.
- https://www.ecma-international.org/ecma-262/9.0/index.html#sec-ecmascript-language-types is the entry point about what types the language supports, and it introduces the concept that everything there is is either a rather standard value (boolean, string etc.), or an object. But no further types.
- https://www.ecma-international.org/ecma-262/9.0/index.html#sec-object-type explains the Object Type. At heart, it's a collection of attributes and/or accessors (think getter/setter). This also introduces the term "function object".
- https://www.ecma-international.org/ecma-262/9.0/index.html#sec-object-internal-methods-and-internal-slots shows the internal semantics, internal methods etc. of objects. At the end of that section, specifically, the "function object" specific internals ("Call" and "Construct") are described, including little details like the constructor being optional.
Hence, to answer your question: Foo
can be nothing but an object (because everything else on the menu is a basic value type). Hence, Foo()
is a special syntax which simply invokes the internal Call
method of that object. But Foo
itself is an object through and through, you can do with it everything else you can do with any other object, including setting arbitrary attributes on it.
Having a method defined on an object simply means that there is an attribute with that name, and the attribute references an object, which happens to be a "function object".
Something which can be used as a constructor is, again, simply an object which happens to have a Construct
internal method, and the syntactic sugar to call it.
As you know, there are no classes in JavaScript, it's a prototype-based object-oriented language (it's as object-oriented as you can get, it literally has nothing else). So any kind of "prototype" is just a link between objects. A constructor method (as explained in the link given above) simply calls the constructor method with the object on which it was called (i.e., something like String
) as an argument, just like the language would call Call
with this
being the object the method has been invoked on.
Object
is the constructor function of all objects. So, typeof Object==="function"
Here is a snippet for visualisation:
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()
Function
is the constructor function of all functions (including itself...)
So, although not everything is a function, but most of Uppercase native identifiers refers to a constructor function.
Yes, Object is of type function. It is a class/Function implementation which when invoked with new (new Object()
) will result in an object with allocated memory.
ReferenceURL : https://stackoverflow.com/questions/54861385/is-object-a-function-in-javascript
'program tip' 카테고리의 다른 글
스팸을 피하기 위해 웹 사이트에 이메일 주소를 표시하는 방법은 무엇입니까? (0) | 2021.01.11 |
---|---|
dplyr로 특정 값을 NA로 설정 (0) | 2021.01.11 |
DataContractSerializer에 의해 생성 된 XML 서식 (0) | 2021.01.11 |
C # 분산 문제 : 목록 할당 (0) | 2021.01.10 |
Go에서 크기 조정이 가능한 배열을 구현하는 방법 (0) | 2021.01.10 |