[javascript] JavaScript에서 ‘새’키워드는 무엇입니까?

new사람들이 JavaScript를 객체 지향 프로그래밍 언어가 아니라고 생각하는 경향이 있기 때문에 JavaScript 의 키워드는 처음 접했을 때 상당히 혼란 스러울 수 있습니다.

  • 무엇입니까?
  • 어떤 문제가 해결됩니까?
  • 적절한시기와시기는?


답변

그것은 5 가지 일을한다 :

  1. 새 객체를 만듭니다. 이 객체의 타입은 단순히 object 입니다.
  2. 이 새로운 객체의 접근 불가능한 내부 [[prototype]] (예 : __proto__ ) 속성을 생성자 함수의 외부의 접근 가능한 프로토 타입 객체로 설정합니다 (모든 함수 객체에는 자동으로 프로토 타입 속성이 있음).
  3. 그것은하게 this새로 만든 객체에 변수 지점을.
  4. this언급 될 때마다 새로 작성된 객체를 사용하여 생성자 함수를 실행합니다 .
  5. 생성자 함수가 null객체 가 아닌 참조를 반환하지 않으면 새로 만든 객체를 반환합니다 . 이 경우 해당 객체 참조가 대신 반환됩니다.

참고 : 생성자 함수 는 다음과 같이 new키워드 뒤의 함수를 나타냅니다 .

new ConstructorFunction(arg1, arg2)

이 작업이 완료되면 새 객체의 정의되지 않은 속성이 요청되면 스크립트는 대신 객체의 [[prototype]] 객체에서 속성을 확인합니다. 이것은 JavaScript에서 전통적인 클래스 상속과 비슷한 것을 얻는 방법입니다.

이것에 대해 가장 어려운 부분은 포인트 번호 2입니다. 모든 객체 (함수 포함)에는 [[prototype]] 이라는 내부 속성이 있습니다. new 를 사용 하거나 Object.create 를 사용하거나 리터럴을 기준으로 오브젝트 작성시 에만 설정할 수 있습니다 (함수 기본값은 Function.prototype, 숫자는 Number.prototype 등). Object.getPrototypeOf (someObject) 로만 읽을 수 있습니다 . 이 값을 설정하거나 읽는 다른 방법 은 없습니다 .

기능, 숨겨진 외에도 [[프로토 타입]] 속성도라는 속성이 프로토 타입을 , 그리고 당신이 액세스 할 수있는이 있다는 것입니다, 수정은 당신이 할 객체에 대한 상속 된 속성 및 방법을 제공 할 수 있습니다.


예를 들면 다음과 같습니다.

ObjMaker = function() {this.a = 'first';};
// ObjMaker is just a function, there's nothing special about it that makes 
// it a constructor.

ObjMaker.prototype.b = 'second';
// like all functions, ObjMaker has an accessible prototype property that 
// we can alter. I just added a property called 'b' to it. Like 
// all objects, ObjMaker also has an inaccessible [[prototype]] property
// that we can't do anything with

obj1 = new ObjMaker();
// 3 things just happened.
// A new, empty object was created called obj1.  At first obj1 was the same
// as {}. The [[prototype]] property of obj1 was then set to the current
// object value of the ObjMaker.prototype (if ObjMaker.prototype is later
// assigned a new object value, obj1's [[prototype]] will not change, but you
// can alter the properties of ObjMaker.prototype to add to both the
// prototype and [[prototype]]). The ObjMaker function was executed, with
// obj1 in place of this... so obj1.a was set to 'first'.

obj1.a;
// returns 'first'
obj1.b;
// obj1 doesn't have a property called 'b', so JavaScript checks 
// its [[prototype]]. Its [[prototype]] is the same as ObjMaker.prototype
// ObjMaker.prototype has a property called 'b' with value 'second'
// returns 'second'

사용하는 모든 객체 new ObjMaker()가 ‘b’속성을 상속받은 것처럼 보이기 때문에 클래스 상속과 같습니다 .

서브 클래스와 같은 것을 원한다면 다음을 수행하십시오.

SubObjMaker = function () {};
SubObjMaker.prototype = new ObjMaker(); // note: this pattern is deprecated!
// Because we used 'new', the [[prototype]] property of SubObjMaker.prototype
// is now set to the object value of ObjMaker.prototype.
// The modern way to do this is with Object.create(), which was added in ECMAScript 5:
// SubObjMaker.prototype = Object.create(ObjMaker.prototype);

SubObjMaker.prototype.c = 'third';  
obj2 = new SubObjMaker();
// [[prototype]] property of obj2 is now set to SubObjMaker.prototype
// Remember that the [[prototype]] property of SubObjMaker.prototype
// is ObjMaker.prototype. So now obj2 has a prototype chain!
// obj2 ---> SubObjMaker.prototype ---> ObjMaker.prototype

obj2.c;
// returns 'third', from SubObjMaker.prototype

obj2.b;
// returns 'second', from ObjMaker.prototype

obj2.a;
// returns 'first', from SubObjMaker.prototype, because SubObjMaker.prototype 
// was created with the ObjMaker function, which assigned a for us

마지막 으로이 페이지를 찾기 전에이 주제에 대해 많은 쓰레기를 읽었습니다. 이 페이지 는 멋진 다이어그램으로 잘 설명되어 있습니다.


답변

이 기능이 있다고 가정하십시오.

var Foo = function(){
  this.A = 1;
  this.B = 2;
};

이것을 독립형 함수로 호출하면 다음과 같습니다.

Foo();

이 함수를 실행하면 window객체 ( AB) 에 두 가지 속성이 추가됩니다 . 받는 사람이 추가합니다 window때문에이 window당신이 그런 식으로 그것을 실행할 때 함수를 호출하는 객체이며, this함수의 기능이라고하는 객체입니다. 적어도 자바 스크립트에서.

이제 다음과 같이 호출하십시오 new.

var bar = new Foo();

new함수 호출에 추가 하면 새 객체가 생성되고 (just var bar = new Object()) this함수 내에서 함수를 호출 한 객체가 아니라 방금 생성 한 새 객체가 함수 내부를 가리키는 Object것입니다. 그래서 bar지금의 속성을 가진 객체입니다 AB. 모든 함수는 생성자가 될 수 있으며 항상 의미가있는 것은 아닙니다.


답변

Daniel Howard의 답변 외에도 다음과 같은 기능이 있습니다 new.

function New(func) {
    var res = {};
    if (func.prototype !== null) {
        res.__proto__ = func.prototype;
    }
    var ret = func.apply(res, Array.prototype.slice.call(arguments, 1));
    if ((typeof ret === "object" || typeof ret === "function") && ret !== null) {
        return ret;
    }
    return res;
}

동안

var obj = New(A, 1, 2);

에 해당

var obj = new A(1, 2);


답변

초보자가 더 잘 이해할 수 있도록

브라우저 콘솔에서 다음 코드를 시도하십시오.

function Foo() {
    return this;
}

var a = Foo();       //returns window object
var b = new Foo();   //returns empty object of foo

a instanceof Window;  // true
a instanceof Foo;     // false

b instanceof Window;  // false
b instanceof Foo;     // true

이제 커뮤니티 위키 답변을 읽을 수 있습니다 🙂


답변

따라서 아마도 객체의 인스턴스를 생성하기위한 것이 아닙니다.

그것을 위해 정확하게 사용됩니다. 다음과 같이 함수 생성자를 정의하십시오.

function Person(name) {
    this.name = name;
}

var john = new Person('John');

그러나 ECMAScript의 추가 이점은 .prototype속성을 사용하여 확장 할 수 있으므로 다음과 같은 작업을 수행 할 수 있다는 것입니다.

Person.prototype.getName = function() { return this.name; }

이 생성자에서 생성 된 모든 객체는 이제 getName액세스 할 수있는 프로토 타입 체인 으로 인해 생성됩니다 .


답변

JavaScript 객체 지향 프로그래밍 언어이며 인스턴스 작성에 정확하게 사용됩니다. 클래스 기반이 아니라 프로토 타입 기반이지만 객체 지향적이지 않다는 의미는 아닙니다.


답변

Javascript는 객체 지향 프로그래밍 패러다임을 지원하는 동적 프로그래밍 언어이며 객체의 새 인스턴스를 만드는 데 사용됩니다.

객체에는 클래스가 필요하지 않습니다. Javascript는 프로토 타입 기반 언어입니다.