new
사람들이 JavaScript를 객체 지향 프로그래밍 언어가 아니라고 생각하는 경향이 있기 때문에 JavaScript 의 키워드는 처음 접했을 때 상당히 혼란 스러울 수 있습니다.
- 무엇입니까?
- 어떤 문제가 해결됩니까?
- 적절한시기와시기는?
답변
그것은 5 가지 일을한다 :
- 새 객체를 만듭니다. 이 객체의 타입은 단순히 object 입니다.
- 이 새로운 객체의 접근 불가능한 내부 [[prototype]] (예 : __proto__ ) 속성을 생성자 함수의 외부의 접근 가능한 프로토 타입 객체로 설정합니다 (모든 함수 객체에는 자동으로 프로토 타입 속성이 있음).
- 그것은하게
this
새로 만든 객체에 변수 지점을. this
언급 될 때마다 새로 작성된 객체를 사용하여 생성자 함수를 실행합니다 .- 생성자 함수가
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
객체 ( A
및 B
) 에 두 가지 속성이 추가됩니다 . 받는 사람이 추가합니다 window
때문에이 window
당신이 그런 식으로 그것을 실행할 때 함수를 호출하는 객체이며, this
함수의 기능이라고하는 객체입니다. 적어도 자바 스크립트에서.
이제 다음과 같이 호출하십시오 new
.
var bar = new Foo();
new
함수 호출에 추가 하면 새 객체가 생성되고 (just var bar = new Object()
) this
함수 내에서 함수를 호출 한 객체가 아니라 방금 생성 한 새 객체가 함수 내부를 가리키는 Object
것입니다. 그래서 bar
지금의 속성을 가진 객체입니다 A
및 B
. 모든 함수는 생성자가 될 수 있으며 항상 의미가있는 것은 아닙니다.
답변
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는 프로토 타입 기반 언어입니다.