{…} 구문을 사용하면 하나의 객체를 생성할 수 있지만 유사한 객체를 여러 개 생성해야 하는 경우 생성자와 "new" 연산자를 사용해야 합니다.
Constructor는 기술적으로 일반적인 함수이지만 일반적으로 두 가지 규칙이 있습니다.
1 이름의 첫 글자는 대문자입니다.
2. new 연산자를 사용해서만 실행해야 합니다.
예:
function User(name) { this.name = name; this.isAdmin = false; } let user = new User("Jack"); alert(user.name); // Jack alert(user.isAdmin); // false
new User()
가 실행될 때 뒤에서 무슨 일이 일어나는지 살펴볼까요? new User()
时背后到底做了什么?
1、首先创建一个空对象,然后赋值给this。
2、执行函数,通常修改this对象,增加一些新的属性。
3、this被返回。
换句话说,new User()
内容如下代码所示:
function User(name) { // this = {}; (implicitly) // we add properties to this this.name = name; this.isAdmin = false; // return this; (implicitly) }
所以 new User("Jack")
的结果和下面代码一致:
let user = { name: "Jack", isAdmin: false };
现在我们想创建其他对象,我们可以使用new User("Ann")
,new User("Alice")
等。比每次使用文字描述对象方式更简短,且易读。
这时构造函数的主要目的——————实现创建对象的代码重用。
让我们再次注意:
技术上,任何函数都可以用作构造器,即任何函数都可以使用new调用,并且也执行上面描述的算法。
首字母大写只是一个常规约定,使其更清晰说明其为构造韩式,应该使用new调用。
new function(){…}
如果我们有多行代码,用于创建一个复杂对象,我们可以包装他们使用构造函数,代码如下:
let user = new function() { this.name = “John”; this.isAdmin = false; // ...other code for user creation // maybe complex logic and statements // local variables etc };
该构造器不能被再次调用,因为没有被保存,仅仅被调用创建对象。这个技巧的母的只是为了封装单个复杂对象代码。
函数内部,我们可以检查其调用方式是否使用new方式。使用一个特殊的属性new.target
1. 먼저 빈 개체를 만든 다음 여기에 할당하세요.
2. 함수를 실행하고 일반적으로 이 개체를 수정하고 몇 가지 새로운 속성을 추가합니다.
new User()
의 내용은 다음과 같습니다. function User() { alert(new.target); } User(); // undefined new User(); // function User { ... }그래서
new User("Jack")
의 결과는 다음과 일치합니다. code: function User(name) { if (!new.target) { // if you run me without new return new User(name); // ...I will add new for you } this.name = name; } let john = User("John"); // redirects call to new User alert(john.name); // John
new User("Ann")
, new User("Alice")
등을 사용할 수 있습니다. 개체를 설명할 때마다 텍스트를 사용하는 것보다 더 짧고 읽기 쉽습니다. 이때 생성자의 주요 목적은 객체 생성을 위한 코드 재사용을 달성하는 것입니다.
다시 한 번 알아두세요:
기술적으로 모든 함수를 생성자로 사용할 수 있습니다. 즉, new를 사용하여 모든 함수를 호출할 수 있으며 위에서 설명한 알고리즘을 수행할 수도 있습니다.
new function(){…}
복잡한 객체를 생성하기 위해 여러 줄의 코드가 있는 경우 생성자를 사용하여 이를 래핑할 수 있으며 코드는 다음과 같습니다.
function BigUser() { this.name = "John"; return { name: "Godzilla" }; // <-- returns an object } alert( new BigUser().name ); // Godzilla, got that object생성자를 다시 호출할 수 없는 이유는 다음과 같습니다. 저장되지 않고 단지 객체를 생성하기 위해 호출되었습니다. 이 기술의 목적은 단순히 하나의 복잡한 개체 코드를 캡슐화하는 것입니다.
함수 내부에서 호출 메서드가 새 메서드를 사용하는지 확인할 수 있습니다. 이는 특수 속성 new.target
을 사용하여 수행됩니다.
function SmallUser() { this.name = "John"; return; // finishes the execution, returns this // ... } alert( new SmallUser().name ); // John
let user = new User; // <-- no brackets // same as let user = new User();
생성자 반환 값
function User(name) { this.name = name; this.sayHi = function() { alert( "My name is: " + this.name ); }; } let john = new User("John"); john.sayHi(); // My name is: John /* john = { name: "John", sayHi: function() { ... } } */
rrreee
대부분의 생성자는 반환할 필요가 없습니다. 여기서는 지적 완전성을 위해 이 특별한 동작을 상기시켜 드립니다.괄호 무시
위 내용은 JavaScript의 생성자 및 new 연산자의 예에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!