2013-02-15 2 views
1

은 가능한이결합 자바 스크립트 프로토 타입 스타일

somethingElse.prototype = { 
    someFunction: function() {}, 
    ... 
} 

으로 다음

function something() {} 
function somethingElse() {} 

somethingElse.prototype = new something(); 
somethingElse.prototype.someFunction = function() {} 
... 

을 결합하고, 내가 생각 순수 화장품 인 프로토 타입 상속 체인

을 유지입니다. 나는 방금 {} 안의 모든 함수를 정의하고 싶다. 방대한 양의 ... prototype ... =

나는 꽤 많은 것을 보았지만 결코 가져 오지 못했다.

+0

시도해 보셨습니까? – Shmiddty

+0

나는 후에 __proto__를 설정하는 등 여러 가지를 시도했다. __proto__는 꽤 펑키했다. – 0xFADE

답변

1

개인적으로 가장 좋아하는 방법은 underscore.js 라이브러리를 가져 오는 것입니다. 속성에 객체를 집어 넣기 위해 extend라는 정말 멋진 메소드가 있습니다. 당신은 Object.defineProperties을 사용할 수 있습니다

function something() {} 
function somethingElse() {} 

somethingElse.prototype = new something(); 

_.extend(somethingElse.prototype, { 
    someFunction: function() { }, 
    someOtherFunction: function() { } 
}); 
+0

나는 이것과 함께 가야 할 것입니다. 그것은 내가 실제로 찾고 있었던 해결책이 아니지만 그것을한다. 밑줄 소스를 보면, 지나가는 모든 객체를 복사하는 것만으로 꽤 느리게 들립니다. – 0xFADE

0

두 번째 버전에서 somethingElse 인스턴스는 something 및 프로토 타입 체인에서 아무 것도 상속하지 않습니다. 귀하의 예제 코드를 고려하면, 그것은 아무런 차이를 만들지 않을 것이다.

+2

'instanceof'가 중요 할 때 중요합니다. – Shmiddty

+0

그게 전부였습니다. 두 번째 부분은 상속 체인 작업을 수행 할 수 없습니다. 크리스의 연장은 그 일을 할 것입니다. 나는 포함 할 필요가없는 것을 원했다. – 0xFADE

+0

@ 0xFADE 분명히 나는 ​​"당신의"프로토 타입 - 상속 - 체인 "문장을 놓쳤습니다. – bfavaretto

0

글쎄, 그들은 실제로 똑같습니다.

foo = {} 
foo.bar = baz 

그것은 취향의 문제이다

foo = { 
    bar: baz 
} 

과 동일합니다.

BTW : 생성자 (새로운 것으로 호출 될 수있는 모든 것)를 초기 자본과 함께 지정하여 정규 함수와 구별하는 것이 더 좋은 스타일이라고 생각합니다. 혼동하면 매우 나쁜 일을 할 수 있기 때문입니다.

0

하지만 실제로 더 자세한, 그리고 기존 브라우저에서 지원하지 않습니다 : 그래서, 내가 할 수있는 당신은 초보적인 extend 방법을 추가 할 수 있습니다, 또는

Object.defineProperties(somethingElse.prototype,{ 
    someOtherFunction: { 
     value:function() {...} 
    }, 
    ... 
}); 

을 개체 프로토 타입 :

: 당신이 할 수

Object.prototype.extend = function(obj){ 
    for(var p in obj)this[p] = obj[p]; 
}; 

somethingElse.prototype.extend({ 
    A:function(){'a'}, 
    B:function(){'b'} 
}); 

일반적으로 네이티브 개체의 프로토 타입을 수정하는 것이 위험 할 수 있으므로이 방법을 사용하는 것이 좋습니다.

+0

감사합니다. 나는 그 반대가 가능한지 궁금해. 객체를 복사하기 위해이 모든 작업을 수행하는 대신 원형을 생성 할 때 프로토 타입을 정확하게 설정하는 방법이 있습니다. obj.prototype = { ... _something_that_defines_the_prototype : 새로운 내용() } – 0xFADE

관련 문제