예, 각 클래스에는 생성자가 하나만 있을 수 있습니다. 생성자가 여러 개인 경우 예외가 발생합니다. 생성자는 주로 객체를 초기화하는 데 사용되는 특수 함수입니다. 즉, 객체 멤버 변수에 초기 값을 할당합니다. 생성자를 사용할 때 주의해야 할 두 가지 사항은 다음과 같습니다. 1. 생성자는 특정 유형을 생성하는 데 사용됩니다. object의 첫 글자는 대문자여야 합니다. 2. 생성자는 new와 함께 사용될 때만 의미가 있습니다.
이 튜토리얼의 운영 환경: 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
생성자 관련 문제
생성자 메서드는 사용하기 쉽지만 메모리 낭비 문제가 있습니다.
우리는 모든 객체가 동일한 기능을 사용하여 메모리를 절약하기를 바랍니다.
Constructor 프로토타입 프로토타입
Constructor 프로토타입을 통해 할당된 기능은 모든 객체에서 공유됩니다.
JavaScript에서는 모든 생성자에 다른 객체를 가리키는 프로토타입 속성이 있다고 규정합니다. 이 프로토타입은 객체이며 이 객체의 모든 속성과 메서드는 생성자의 소유입니다.
프로토타입 객체에 직접 불변 메소드를 정의할 수 있으므로 객체의 모든 인스턴스가 이러한 메소드를 공유할 수 있습니다.
객체의 속성을 인쇄하고 프로토타입을 봅니다.
function Star(uname, age) { this.uname = uname; this.age = age; this.sing = function() { console.log('我会唱歌'); } } console.dir(Star);
출력 결과:
프로토타입이 무엇인가요?
객체, 프로토타입 객체라고도 합니다.
프로토타입의 기능은 무엇인가요?
공유 방법.
예:
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__ 객체 프로토타입의 의미는 객체 검색 메커니즘에 대한 방향 또는 경로를 제공하는 것이지만 비표준 속성이므로 실제 개발에서는 다음과 같습니다. 속성은 사용할 수 없으며 내부적으로 프로토타입 객체 프로토타입
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 方法을 가리킬 뿐입니다.
constructor 构造函数
对象原型__proto__和构造函数(prototype)原型对象里面都有一个属性 constructor 属性 ,constructor 我们称为构造函数,因为它指回构造函数本身。
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);
给原型对象采取对象形式赋值,会覆盖构造函数原型对象原来的内容,就不会有constructor指向当前构造函数
Star.prototype = { sing: function() { console.log('我会唱歌'); }, movie: function() { console.log('我会演电影'); } } console.dir(Star);
解决办法:手动的利用constructor指回原来的构造函数
Star.prototype = { // 如果我们修改了原来的原型对象,给原型对象赋值的是一个对象,则必须手动的利用constructor指回原来的构造函数 constructor: Star, sing: function() { console.log('我会唱歌'); }, movie: function() { console.log('我会演电影'); } }
构造函数、实例、原型对象三者之间的关系
【相关推荐:javascript视频教程、编程视频】
위 내용은 es6에는 생성자가 하나만 있을 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!