>웹 프론트엔드 >프런트엔드 Q&A >es6에는 생성자가 하나만 있을 수 있나요?

es6에는 생성자가 하나만 있을 수 있나요?

青灯夜游
青灯夜游원래의
2022-10-18 15:04:532185검색

예, 각 클래스에는 생성자가 하나만 있을 수 있습니다. 생성자가 여러 개인 경우 예외가 발생합니다. 생성자는 주로 객체를 초기화하는 데 사용되는 특수 함수입니다. 즉, 객체 멤버 변수에 초기 값을 할당합니다. 생성자를 사용할 때 주의해야 할 두 가지 사항은 다음과 같습니다. 1. 생성자는 특정 유형을 생성하는 데 사용됩니다. object의 첫 글자는 대문자여야 합니다. 2. 생성자는 new와 함께 사용될 때만 의미가 있습니다.

es6에는 생성자가 하나만 있을 수 있나요?

이 튜토리얼의 운영 환경: Windows 7 시스템, ECMAScript 버전 6, Dell G3 컴퓨터.

일반적인 OOP 언어(예: Java)에는 클래스 개념이 있습니다. 클래스는 객체의 템플릿이고 객체는 클래스의 인스턴스입니다. 그러나 ES6 이전에는 클래스 개념이 있었습니다. JS에는 도입되지 않았습니다.

ES6 이전에는 클래스를 기반으로 객체를 생성하지 않고 생성자라는 특수 함수를 사용하여 객체와 그 특성을 정의했습니다.

다음 세 가지 방법으로 개체를 만듭니다.

  • Object literal

  • new Object()

  • Custom 생성자

// 1、利用 new Object() 创建对象
var obj1 = new Object();

// 2、利用对象字面量创建对象
var obj2 = {};

// 利用构造函数创建对象
function Star(name,age) {
    this.name=name;
    this.age=age;
    this.sing=function(){
        console.log('唱歌');
    }
}

var ldh=new Star('刘德华',23);
console.log(ldh);
ldh.sing();
// Star { name: '刘德华', age: 23, sing: [Function (anonymous)] }
//唱歌

Constructor

function은 주로 특수한 기능입니다. 객체를 초기화하는 데 사용됩니다. 즉, 객체 멤버 변수에 초기 값을 할당하는 데 사용됩니다. 항상 new와 함께 사용됩니다. 객체에서 일부 공용 속성과 메서드를 추출하여 이 함수에 캡슐화할 수 있습니다.

JS에서는 생성자를 사용할 때 다음 두 가지 점에 주의해야 합니다.

  • (1) 생성자는 특정 유형의 객체를 생성하는 데 사용되며 첫 글자는 대문자로 표시되어야 합니다.

  • (2 ) 생성자는 new와 동일해야 합니다. 함께 사용하는 것이 합리적입니다

각 클래스는 생성자를 하나만 가질 수 있습니다. 생성자가 여러 개인 경우 예외가 발생합니다.

// 类的声明
class Person {
 // 类的构造方法 注:一个类只能有一个构造函数, 如果没有定义那就自动用默认的
 // 通过new关键字操作类的时候,会调用constructor函数,并执行如下操作
 // 1、在内存中创建一个对象 moni = {}
 // 2、 将类的原型prototype赋值给创建出来的对象 moni.__proto__ = Person.prototype
 // 3、将对象赋值给函数的this:new绑定 this = moni
 // 4、执行函数中的代码
 // 5、自动返回创建出来的对象
 constructor() {
 }
}
 
 
let p1 = new Person()
 
let P2 = new Person('kobe', 30)

new는 다음과 같은 경우 네 가지 작업을 수행합니다. 실행:

(1 )은 메모리에 새로운 빈 개체를 만듭니다.

(2) 이 지점이 이 새로운 객체를 가리키도록 하세요.

(3) 생성자에서 코드를 실행하고 이 새 개체에 속성과 메서드를 추가합니다.

(4)는 이 새 객체를 반환합니다(따라서 생성자에서 반환이 필요하지 않습니다).

일부 멤버는 생성자 자체 또는 생성자 내부의 JavaScript 생성자에 추가될 수 있습니다. 이 두 가지 방법을 통해 추가된 멤버를 각각 정적 멤버와 인스턴스 멤버라고 합니다.

  • 정적 멤버: 생성자에 추가된 멤버를 정적 멤버라고 하며 생성자 자체에서만 액세스할 수 있습니다.

  • 인스턴스 멤버: 생성자 내부에 생성된 개체 멤버를 인스턴스 멤버라고 하며 다음으로만 액세스할 수 있습니다. 인스턴스화된 객체

예:

// 构造函数中的属性和方法称为成员
function Star(uname, age) {
    this.uname = uname;
    this.age = age;
    this.sing = function() {
        console.log('我会唱歌');

    }
}
var ldh = new Star('刘德华', 18);

// 1、实例成员就是构造函数内部通过this添加的成员
// uname、age、sing就是实例成员
// 实例成员只能通过实例化的对象来访问
console.log(ldh.uname); //刘德华
ldh.sing();  //我会唱歌
// 不可以通过构造函数来访问实例成员
console.log(Star.uname); //undefined

Star.sex='男'
// 2、静态成员 在构造函数本身上添加的成员 sex 就是静态成员
// 静态成员只能通过构造函数来访问
console.log(Star.sex); //男
// 静态成员不能通过对象来访问
console.log(ldh.sex);  //undefined

생성자 관련 문제

생성자 메서드는 사용하기 쉽지만 메모리 낭비 문제가 있습니다.

es6에는 생성자가 하나만 있을 수 있나요?

우리는 모든 객체가 동일한 기능을 사용하여 메모리를 절약하기를 바랍니다.

Constructor 프로토타입 프로토타입

Constructor 프로토타입을 통해 할당된 기능은 모든 객체에서 공유됩니다.

JavaScript에서는 모든 생성자에 다른 객체를 가리키는 프로토타입 속성이 있다고 규정합니다. 이 프로토타입은 객체이며 이 객체의 모든 속성과 메서드는 생성자의 소유입니다.

프로토타입 객체에 직접 불변 메소드를 정의할 수 있으므로 객체의 모든 인스턴스가 이러한 메소드를 공유할 수 있습니다.

객체의 속성을 인쇄하고 프로토타입을 봅니다.

 function Star(uname, age) {
    this.uname = uname;
    this.age = age;
    this.sing = function() {
        console.log('我会唱歌');
    }
}
        console.dir(Star);

출력 결과:

es6에는 생성자가 하나만 있을 수 있나요?

  • 프로토타입이 무엇인가요?

객체, 프로토타입 객체라고도 합니다.

  • 프로토타입의 기능은 무엇인가요?

공유 방법.

예:

function Star(uname, age) {
    this.uname = uname;
    this.age = age;
    // this.sing=function() {
    //     console.log('我会唱歌');
    // }
}
     Star.prototype.sing=function() {
         console.log('我会唱歌');
     }
    var ldh= new Star('刘德华',18);
    var zxy= new Star('张学友',19);
    console.log(ldh.sing===zxy.sing); //采用this添加方法时输出 false 采用prototype添加方法时输出 true
    ldh.sing();
    zxy.sing();

객체 프로토타입__proto__

객체에는 생성자의 프로토타입 프로토타입 객체를 가리키는 __proto__ 속성이 있습니다. 우리 객체가 생성자의 프로토타입 프로토타입 객체의 속성과 메서드를 사용할 수 있는 이유입니다. , 객체에

__proto__ 프로토타입이 존재하기 때문입니다.

__proto__ 객체 프로토타입과 프로토타입 객체 프로토타입은 동일합니다.

__proto__ 객체 프로토타입의 의미는 객체 검색 메커니즘에 대한 방향 또는 경로를 제공하는 것이지만 비표준 속성이므로 실제 개발에서는 다음과 같습니다. 속성은 사용할 수 없으며 내부적으로 프로토타입 객체 프로토타입

es6에는 생성자가 하나만 있을 수 있나요?

        function Star(uname, age) {
            this.uname = uname;
            this.age = age;
        }
        Star.prototype.sing=function(){
            console.log('我会唱歌');
        }
        var ldh = new Star('刘德华', 18);
        var zxy = new Star('张学友', 19);
        console.log(ldh); 
        //对象身上系统自己添加一个__proto__ 指向构造函数的原型对象 prototype
        console.log(ldh.__proto__===Star.prototype); //true
        // 方法的查找规则(以sing方法为例):
        // 首先看 实例对象身上是否有 sing 方法,如果有就执行这个对象的sing
        // 如果没有sing 方法,因为有__proto__的存在,就去 构造函数原型对象prototype身上找sing 方法

es6에는 생성자가 하나만 있을 수 있나요?

을 가리킬 뿐입니다.

constructor 构造函数

对象原型__proto__和构造函数(prototype)原型对象里面都有一个属性 constructor 属性 ,constructor 我们称为构造函数,因为它指回构造函数本身。

es6에는 생성자가 하나만 있을 수 있나요?

constructor 主要用于记录该对象引用于哪个构造函数,它可以让原型对象重新指向原来的构造函数。

一般情况下,对象的方法都在构造函数的原型对象中设置。如果有多个对象的方法,我们可以给原型对象采取对象形式赋值,但是这样就会覆盖构造函数原型对象原来的内容,这样修改后的原型对象 constructor  就不再指向当前构造函数了。此时,我们可以在修改后的原型对象中,添加一个 constructor 指向原来的构造函数。

   function Star(uname, age) {
            this.uname = uname;
            this.age = age;
        }
        Star.prototype = {
            // 如果我们修改了原来的原型对象,给原型对象赋值的是一个对象,则必须手动的利用constructor指回原来的构造函数
            constructor: Star,
            sing: function() {
                console.log('我会唱歌');
            },
            movie: function() {
                console.log('我会演电影');
            }
        }
        var ldh = new Star('刘德华', 18);
        console.log(Star.prototype.constructor);
        console.log(ldh.__proto__.constructor);

es6에는 생성자가 하나만 있을 수 있나요?

给原型对象采取对象形式赋值,会覆盖构造函数原型对象原来的内容,就不会有constructor指向当前构造函数

        Star.prototype = {
            sing: function() {
                console.log('我会唱歌');
            },
            movie: function() {
                console.log('我会演电影');
            }
        }
      console.dir(Star);

es6에는 생성자가 하나만 있을 수 있나요?

解决办法:手动的利用constructor指回原来的构造函数

        Star.prototype = {
            // 如果我们修改了原来的原型对象,给原型对象赋值的是一个对象,则必须手动的利用constructor指回原来的构造函数
            constructor: Star,
            sing: function() {
                console.log('我会唱歌');
            },
            movie: function() {
                console.log('我会演电影');
            }
        }

构造函数、实例、原型对象三者之间的关系

es6에는 생성자가 하나만 있을 수 있나요?

【相关推荐:javascript视频教程编程视频

위 내용은 es6에는 생성자가 하나만 있을 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.