1. 다음과 같은 클래스가 있습니다.
function Person(name) {
this.name = name
}
let p = new Person('Tom');
1. p._proto_는 무엇입니까?
답변 : Person.prototype
2. Person._proto_는 무엇과 같습니까?
답 : Function.prototype
분석:
1, 2는 모두 프로토 타입 체인에 대한 지식과 관련된 동일한 문제입니다. 한 문장 만 기억하십시오 : 인스턴스의 _proto_ 속성 (프로토 타입)은 생성자의 프로토 타입 속성과 같습니다 . 인스턴스 p의 생성자는 Person이고 Person의 생성자는 Function입니다.
유추로 이해하다
var f = {}
F = function (){};
Object.prototype.a = 'value a';
Function.prototype.b = 'value b';
console.log(f.a)
console.log(f.b)
console.log(F.a)
console.log(F.b)
결과:
값 a;
찾으시는 주소가 없습니다;
값 a;
값 b;
분석:
f는 Object의 인스턴스이고, F는 Function의 인스턴스이며, 객체의 속성은 프로토 타입 체인을 따라 레이어별로 조회됩니다. 찾을 수없는 경우 시작되지 않습니다.
3. 줄기를
function Person(name) {
this.name = name
return name
}
let p = new Person('Tom')
Person 인스턴스화 중에 Person은 무엇을 반환합니까 (또는 p는 무엇입니까)?
대답:
{name: "Tom"}
4. 줄기를
function Person(name) {
this.name = name
return {}
}
let p = new Person('Tom');
Person 인스턴스화 중에 Person은 무엇을 반환합니까 (또는 p는 무엇입니까)?
{}
분석:
생성자에는 명시적인 반환 값이 필요하지 않습니다. new를 사용하여 객체를 생성 할 때 (생성자 호출) 반환이 객체가 아닌 경우 (숫자, 문자열, 부울 등) 반환 값이 무시되고 반환이 객체이면 객체가 반환됩니다 (참고 : 반환 null도 반환 값을 무시하십시오).
5. typeof와 instanceof의 차이점
자바 스크립트에서 typeof 연산자는 변수의 유형을 결정하는 데 자주 사용됩니다. typeof 연산자를 사용하여 참조 유형을 사용하여 값을 저장하면 문제가 발생합니다. 어떤 유형의 객체를 참조하더라도 항상 'object'를 반환합니다.
instanceof 연산자는 객체의 프로토 타입 체인에 생성자의 프로토 타입 속성이 있는지 여부를 테스트하는 데 사용됩니다. 구문 : object instanceof constructor 매개 변수 : object (검출 할 객체) constructor (생성자) 설명 : instanceof 연산자는 constructor.prototype이 매개 변수 객체의 프로토 타입에 존재하는지 여부를 감지하는 데 사용됩니다.
6. Student가 Person에서 상속을 받으면 (Student 클래스는 Person을 상속하고 프로토 타입을 기반으로 한 상속이 필요함) let s = new Student ( 'Lily'), 그러면 s instanceof Person은 무엇을 반환합니까?
function Person(name) {
this.name = name
}
function Student() {
}
Student.prototype = Person.prototype;
Student.prototype.constructor = Student;
let s = new Student('Tom');
console.log(s instance Person);
답 : 참
7. new와 instanceof의 내부 메커니즘
1. 创建一个新对象,同时继承对象类的原型,即Person.prototype;
2. 执行对象类的构造函数,同时该实例的属性和方法被this所引用,即this指向新构造的实例;
3. 如果构造函数return了一个新的‘对象’,那么这个对象就会取代真个new出来的结果,如果构造函数没有return对象,那么就会返回步骤1所创建的对象,即隐式返回this。(一般情况下构造函数不会返回任何值,不过在一些特殊情况下,如果用户想覆盖这个值,可以选择返回一个普通的对象来覆盖)