2016-10-13 9 views
2

객체에서 호출 될 때 Javascript가 프로토 타입 체인에서 함수를 처리하는 방법을 배우려면 this article on Helephant.com을 참조합니다. 객체가 직접 설정하는 방법이없는 경우Object.prototype에 대한 프로토 타입 체인의 함수 해상도가 생성자로 작동하는 방법

기사 시세,

, 자바 스크립트는 개체를 만든 생성자 함수를 찾습니다. Javascript는 메소드의 생성자의 프로토 타입 속성을 확인합니다. 다음 코드에서

, 당신은 rufus.constructor 글로벌 Object() 생성자 확인, 그래서 직접 JS rufus.constructorObject() 때문에) (글로벌 객체를 확인하거나 문서 인용에 따라 처음 생성자 볼 것이다 위 않을 경우 그러면 prototype 프라퍼티를 찾으십시오. JS가 어떻게 함수를 해결할 것입니까 (rufus.toString). 나는 이것에 확실히 혼동된다.

//PET CONSTRUCTOR 
function Pet(name, species, hello) 

    { this.name = name; 
     this.species = species; 
     this.hello = hello; } 

Pet.prototype = { 
    sayHello : function(){ 
    alert(this.hello); 
    } 
} 

//CAT CONSTRUCTOR 
    function Cat(name, hello, breed, whiskerLength) 
    { this.name = name; 
     this.hello = hello; 
     this.breed = breed; 
     this.whiskerLength = whiskerLength;} 

Cat.prototype = new Pet(); 
var rufus = new Cat("rufus", "miaow", "Maine Coon", 7); 

rufus.toString; 
+0

은 아직 아무것도 확실하지가 :

var rufus2 = Object.create(new Pet()); Object.getPrototypeOf(rufus) === Object.getPrototypeOf(rufus2); // true 

toString 방법은 해결 방법에 대해서 :이 같은 프로토 타입을 설정할 수 있습니까? –

답변

2

개체에 직접 설정된 메서드가없는 경우 javacript 은 개체를 만든 생성자 함수를 찾습니다. Javascript는 메소드의 생성자의 프로토 타입 속성을 확인합니다.

문구가 혼란 스럽습니다. JavaScript는 __proto__을 통해 프로토 타입 체인을 조회하지 않으며constructor 속성을 사용합니다. 그들은 보통 속성을 통해 객체가 프로토 타입을 얻는 방법이기 때문에 Constructor을 언급했습니다. 그러나 그것은 항상 사실이 아닙니다.

    rufus.hasOwnProperty('toString'); // false -> go up 
(new Pet())   rufus.__proto__.hasOwnProperty('toString'); // false -> go up 
({sayHello :...}) rufus.__proto__.__proto__.hasOwnProperty('toString'); // false -> go up 
(Object.prototype) rufus.__proto__.__proto__.__proto__.hasOwnProperty('toString'); // true 
+0

@Maximums, JS가 사실상 속성/메소드를 찾기 위해'constructor' 속성을 절대로 사용하지 않는다고 확신합니까? 나는 모든 객체가 상속 클래스에 직접 포인터/경로 (__proto__를 통해)를 가지면 생성자 속성을 조회 할 필요가 없다고 믿고 싶다. 저자는 IMHO가 지식이 풍부하며 모든 기사를 읽음으로써 판단한다. –

+0

@Maximums, 그 기사 더 읽기 그녀는 > 모질라 기반 브라우저에서 각 객체는 브라우저가 프로토 타입 체인을 추적하는 방식에 대한 액세스를 제공하는 __proto__이라는 또 다른 속성을 제공합니다. –

+0

그 게시물은 브라우저가 속성과 메서드를 해결하는 데 사용하는 두 가지 방법을 보여줍니다. 모질라 기반의 브라우저는 (__ proto__)와 다른 브라우저 (IE와 웹킷 기반)를 통해'constructor' 속성 조회를 통해 설명했다. –

0
function Person() { } 
Person.prototype.sayName = function() { }; 


var bob = new Person(); 
console.log(bob.sayName === Person.prototype.sayName); // true 
console.log(bob.constructor.prototype.sayName === Person.prototype.sayName); // true 
console.log(bob.__proto__.sayName === Person.prototype.sayName); // true 


console.log(bob.constructor === Person); // true 
console.log(bob.__proto__ === Person.prototype); // true 

사람들은 당신의 관계이다.
개체에서 속성/기능을 찾을 수없는 경우 __proto__ 체인으로 이동하여 찾고있는 항목을 찾습니다. 이전 브라우저에서는 __proto__에 JS devs에 액세스 할 수 없었지만 브라우저/노드가 배후에서 사용한 객체 인 Constructor.prototype 속성을 참조했습니다.

PS : JS에서 심층 계층 구조를 사용하지 마십시오. 그것이 많은 눈물의 길입니다. 깊은 계층 구조는 다른 클래스 기반 언어에서 고통을 야기하지만 기능이 충분할 수있는 JS에서는 불행합니다.

+0

내가 게시 한 코드의 맥락에서 대답 해 주실 수 있습니까? 객체 ('rufus')는 다른 유형 ('Pet')의 객체 ('Cat.prototype = new Pet()')를 상속합니다. .prototype' 자체는 전역'Object.prototype' ('{}')을 상속받습니다. 귀하의 코드에서 생성자와 프로토 타입 객체는 매우 분명하며 제 경우와 같이 훨씬 복잡한 상속 구조에서 상속이 어디에 있는지 이해하는 데 도움이되지 않습니다. –