2017-05-08 5 views
1

반환 키워드 그것을에 관하여 내가 객체를 생성하고 반환 내 자신의 <code>new</code> 기능을 만들었습니다

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

Person.prototype.getName = function() { 
    console.log(this.firstName + " " + this.lastName) 
} 

function spawn(constructor) { 
    var obj = {} 
    Object.setPrototypeOf(obj, constructor.prototype); 
    var myArray = Array.prototype.slice.apply(arguments) 
    return constructor.apply(obj, myArray.slice(1)) || obj 

} 

var crockford = spawn(Person, "Douglas", "Crockford") 
crockford.getName() 

문제는 그 난이 같은 반환 설정하는 경우 :

return constructor.apply(obj, myArray.slice(1)) || obj 작동을하지만, 할 때 나는 다음과 같은 반환 설정 :

return obj || constructor.apply(obj, myArray.slice(1)) 그것이 말하는을 차이가 무엇을 할 수있다

정의되지 않은 이 둘을 트위터로?

답변

2

obj || constructor.apply(obj, myArray.slice(1))을 설정하면 ||의 첫 번째 값부터 obj가 반환됩니다. 조건은 진실이었다. 거짓이라면 다른 부분을 평가하려했을 것입니다.

그러나 objnot empty입니다.

라인 Object.setPrototypeOf(obj, constructor.prototype); 모두가 실행되며 obj의 프로토 타입이 constructor의 생성 함수의 파라미터가 Person이기 때문에 Person의 프로토 타입으로 설정됩니다. return constructor.apply(obj, myArray.slice(1)) || obj에 의한 첫 번째 경우에

, 당신은 매개 변수 DouglasCrockfordPerson 함수를 호출하지만 두 번째 경우에 당신도 생성자 함수를 호출하지 않습니다.

따라서 firstName 및 lastName 속성은 this 개체에 연결할 수 없습니다.

firstName 및 lastName 값이 없기 때문에 undefined undefined가 표시되는 반면 처음에는 생성자 함수를 호출 할 때 Douglas Crockford를 보았습니다.

분명히하려면 return constructor.apply(obj, myArray.slice(1)) || obj은 ||의 두 번째 부분을 반환합니다. constructor.apply(obj, myArray.slice(1))은 정의되지 않은 값을 반환합니다. firstName 및 lastName 속성은 으로 인해 obj 개체 자체에 연결됩니다.

+0

그래서 constructor.apply (obj, myArray.slice (1))가 false 인 방법은 무엇입니까? –

+0

@AhMedRaXa'constructor.apply (obj, myArray.slice (1)) '호출은 Douglas와 Crockford가있는 Person 함수를 인수로 호출합니다. 이 때문에 getName()을 호출하면 함수의 this.firstName과 this.lastName이 있습니다. –

+0

'constructor.apply (obj, myArray.slice (1))'의 평가가 false가되어'||'의 오른쪽을 평가하는 것을 의미합니까? –