program tip

`Object`는 JavaScript의 함수입니까?

radiobox 2021. 1. 11. 07:55
반응형

`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.

자바 스크립트에서 함수와 객체가 어떻게 관련되는지에 대해서는 다음 사항을 고려하십시오.

  1. 기본이 아닌 모든 유형은 JavaScript의 객체입니다.
  2. 모든 객체는 Object.prototype에서 직접 또는 간접적으로 상속합니다 (프로토 타입이 setPrototypeOf를 사용하여 명시 적으로 변경되지 않는 한).
  3. 모든 네이티브 함수는 Object.prototype에서 상속 된 Function.prototype에서 상속되므로 JavaScript에서는 함수가 객체로 취급되므로 함수가 Object.prototype에서 간접적으로 상속됨을 의미합니다.
  4. 함수가 객체로 취급되는 이유는 다른 함수에 매개 변수로 전달 될 수 있고 함수, 즉 고차 함수 (JavaScript의 강력한 기능)에서 반환 될 수 있기 때문입니다.
  5. ()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.

  6. As the function is treated as an object in JavaScript, we can add properties to it, create new objects from it.
  7. 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 using new 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.

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

반응형