2012-11-17 5 views
3

자바 클래스 vector을 0으로 초기화 된 배열로 만들고 싶습니다. 나중에 수학 함수를 추가하고 싶지만, 프로그램이 많은 양의 데이터를 다루기 때문에 원시 타입의 메모리 나 성능 특성을 희생하고 싶지는 않습니다. (그것은 기본적으로 과학적 시각화입니다.)Javascript에서 상속받은 배열 또는 입력 된 배열

나는 파이어 폭스 나에게 오류

TypeError: Array.prototype.toSource called on incompatible Object

이 파이어 폭스의 버그를 제공

vector.prototype = Object.create(Array.prototype); 

를 사용하려고 프로토 타입 체인에 Array.prototype를 삽입하려면? 그것은 Webkit에서 작동하는 것 같습니다.

그래서 내가 원하는대로 가까이에 있으며, 기본값으로 0으로 초기화 된 Float32Array을 사용하려고했습니다.

var vector = function(size) { Float32Array.call(this, size); } 
vector.prototype = Object.create(Float32Array.prototype); 

Firefox에서는이 작업이 실행되지만 new은 개체를 제대로 초기화하지 않습니다. Webkit에서 new vector은 예외를 throw합니다. 대신 vector.prototype = Float32Array.prototype을 사용하면 아무런 차이가 없습니다.

근본적으로 너무 많이 묻고 있습니까?

+0

질문이 있습니까? :) –

+0

@FelixKling Sounds like ... 그리고'toSource'는 파이어 폭스 전용 확장 기능이므로 표준에 의해 반드시 위임되지는 않습니다. 내 주요 질문은 그것이 예외를 던져서 비표준인지 여부입니다. – Potatoswatter

+0

@SergioTulentsev Firefox의 버그입니까? 또는'Object.create (Array.prototype); 일부 모호한 이유로 불법입니까? – Potatoswatter

답변

3

언어에 내장 된 매우 특별한 기능과 배열 처리 방법 때문에 JavaScript Array에서 실제로 상속하는 것은 거의 불가능합니다. 당신은 많은 답변을 보게 될 것이지만, 대부분은 특별한 상황에서 실패 할 것입니다. 1) 상속 한 경우 특수 길이 속성이 손실됩니다. 2) __ ProtoType __ 변수를 사용하면 비표준이며 모든 브라우저에서 작동하지 않습니다. 3) 제 3 자 라이브러리에서 배열을 감지하는 방법에는 여러 가지가 있으며, 검사 할 때 실패 할 수 있습니다. instanceof Array.isArray 및 == [ 'Object Array'] 모두 사용할 수 있습니다.

자세한 읽기 위해, 나는 내가 진짜 배열을 반환하고 이러한 모든 문제를 피할 수있는 해결책을 가지고이 문서 How ECMA still does not allow to subclass array

을 제안합니다. 여기가 바이올린입니다 Inhetit from JavaScript Array 바이올린에 대한 탐지, 길이 및 기능 테스트가 있습니다.

var ArrayGenerator = (function() { 
    var args = [].slice.call(arguments); 
    var Arr = new Array(); 
    var ovevar ArrayGenerator = (function() { 
    var args = [].slice.call(arguments); 
    var Arr = new Array(); 
    var overiddenPush = Arr.push; 
    args.forEach(function (arg) { 
     Arr.push(arg); 
    }); 
    args = null; 
    Arr.push = function (args) { 
     overiddenPush.apply(this, arguments); 
    } 
    Arr.TableName = "YourTable"; 
    return Arr; 
}); 

// 당신은 초기화

  • 없음 감지 문제
  • 당신이 원하는 모든 것을 무시하고 사용자 정의 속성과 메소드 단지를 추가 할 수 있습니다이

    var MyArray=new ArrayGenerator(1,2,3); 
    
    1. 반환 실제 배열처럼 배열 상속 된 배열처럼.

    단순히 배열을 만들고 내부 변수에 원본 메서드를 저장하고 소유 한 공용 메서드를 바꿉니다. 기본 클래스를 호출하려면 프로토 타입 대신 참조 된 메소드를 간단한 상속 된 객체처럼 간단하게 호출하면됩니다.