2011-12-19 3 views
4

다음 코드 Object.create() 및 toString()

var Person = function(firstName, lastName) { 
    this.firstName = firstName; 
    this.lastName = lastName; 
}; 

Person.prototype = { 
    toString: function() { return this.firstName + ' ' + this.lastName; } 
}; 

var test4 = Object.create(Person); 
test4.firstName = "Phat4"; 
test4.lastName = "Wang4"; 
console.log(test4.toString === Object.toString); // true 
console.log(test4.toString === Function.toString); // true 

var test5 = { firstName: "Phat5", lastName: "Wang5" }; 
console.log(test5.toString === test4.toString); // false 
console.log(test4.toString === Function.toString); // true 
console.log(test5.toString === Object.prototype.toString); // true 

console.log(test5.toString()); // [object Object] 
console.log(test4.toString()); // Function.prototype.toString called on incompatible object 

마지막 줄 console.log(test4.toString())이 오류가 발생 이유는 무엇

을 감안할 때? 그것은 test4.toStringtest5.toString과 같지 않다는 것을 보여줍니다. 그러나 나는 그것을 얻지 못합니다 ..

Ps. 스레드 검색을 시도했지만 여전히 대답 할 수 없습니다. 죄송합니다. 대신이의

+0

Node.js를 인 목적? 또는 브라우저에서? – chakrit

답변

3

: 당신

var test4 = Object.create(Person); 

일을해야

:

var test4 = Object.create(Person.prototype); 

당신이 그것을 가지고 방법을 test4는 프로토 타입 체인에 Person기능했다,하지 의도 프로토 타입 객체 그게 당신의 toString 방법입니다.

이 때문에 Function 개체에 대해 호출 될 것으로 예상되는 toString() 메서드를 사용하고있었습니다.

+0

그래서'test4.toString()'은 Object에서 상속받은'toString()'메소드를 오버라이드하는'Function.toString()'입니다. 맞습니까? –

+0

@PhatWangrungarun : 그렇습니다. 일반적인 Object.prototype.toString 메소드를 오버라이드합니다. – RightSaidFred

+0

지금 감사하십시오! –

0

프로토 타입에 할당하고 개체의 프로토 타입에 새 속성을 할당하는 것과는 차이가 있습니다.

당신은 생성자 함수와 같은 기능 사람을 선언하지만, 당신은 꽤 많이 이렇게하여 프로토 타입 뭔가를 할당됩니다

당신이 새로운 오브젝트 키 값 쌍 toString 기능을 할당하는 것을 의미
Person.prototype = { 
    toString: function() { return this.firstName + ' ' + this.lastName; } 
}; 

Person.prototype, 실제로이 같은 짓을해야하는 해 새로운 속성을 추가하는 대신 :

Person.prototype.toString = function() { return this.firstName + ' ' + this.lastName; } 

이것이에서 수반하는 것은입니다 당신은 실제로으로 Person 객체에서 상속하는 새로운 객체를 만들 때 전화 Object.create, 그 구현에서 무슨 일이 일어날 새로운 개체가 새로 만들어집니다 그리고 그 코드를 이전에 그 Person.prototype 과제를 수행하여 만든 자바 스크립트가 가정 프로토 타입 속성을 무시합니다 새 개체를 반환합니다.

0
var Person = function(firstName, lastName) { 
    this.firstName = firstName; 
    this.lastName = lastName; 
    }; var p1=new Person("Phat1","Wang1"); 

P1은

var p2= Object.create(Person); 
p2.firstName="Phat2"; 
p2.lastName="Wang2"; 

P2 함수를