2014-11-06 3 views
2

У меня есть класс, скажем, A. Мне нужно, чтобы объявить там свойство прототипа, который может быть доступен следующим образом:Определение свойства прототипа в TypeScript

var idKey = A.prototype.attributeId; 

Я могу это сделать, используя следующий код:

class A { 
    constructor() { 
     A.prototype.attributeId = "InternalId"; 
    } 
} 

Есть ли лучший способ сделать это?

+0

Вы определенно не хотите определять его в конструкторе, иначе прототип будет переопределен каждый раз, когда вызывается конструктор! –

+0

@ Александр Миллс, вы правы. Я определенно не хотел его определять в конструкторе. Спасибо за напоминание! –

ответ

8

Это не идеально, но это соответствует вашим потребностям.

class A { 
    attributeId:string; 
} 
A.prototype.attributeId = "InternalId"; 

Это получает компилирует ES5 как:

var A = (function() { 
    function A() { 
    } 
    return A; 
})(); 
A.prototype.attributeId = "InternalId"; 
-2

Да, если вы ориентируетесь ECMAScript5 или выше, то вы можете использовать следующий синтаксис свойств на классе

class A { 
     private internalId: number = 1; 
     get attributeId() { 
      return this.internalId; 
     } 
     set attributeId(newVal) { 
      this.internalId = newVal; 
     } 
    } 
+3

Это неверно, поскольку значение internalId существует для каждого экземпляра класса A, а не один раз. Также код инициализации запускается каждый раз, когда вы создаете экземпляр класса A. @ Ответ Мартина правильный –

4

Вот еще один способ, с помощью декораторов:

function setProto(value: any) { 
    return((target: any, key: string) => { 
     target[key] = value; 
    }); 
} 

class A { 
    @setProto("InternalId") 
    attributeId:string; 
} 

Он получает скомпилированы в какой-то клей кода (определяется только один раз), а также:

var A = (function() { 
    function A() { 
    } 
    __decorate([ 
     setProto("InternalId") 
    ], A.prototype, "attributeId"); 
    return A; 
})(); 
0

См. Met корыто, который использует декораторов класса и дженерики, чтобы гарантировать, что вы не присвоить свойству, которое не существует в классе:

const mixin = <B>(behaviour: B) => <M extends B, TFunction extends Function>(Class: TFunction & {new(...args: Array<any>): M}) => { 
    Reflect.ownKeys(behaviour).forEach(key => { 
     if(key !== 'constructor') { 
      if(Class.prototype.hasOwnProperty(key)) 
       console.warn(`Warning: mixin property overrides ${Class.name}.${key}`); 
      Object.defineProperty(Class.prototype, key, Object.getOwnPropertyDescriptor(behaviour, key)) 
     } 
    }); 
    return Class; 
}; 

@mixin({ 
    bar: 'baz' 
}) 
class Foo { 
    bar: string; 
} 

const foo = new Foo; 
console.log(Foo.prototype.bar, foo.bar, foo.hasOwnProperty('bar')); 
// prints baz baz false 

Наследование работает отлично и изменяет только суб-класса прототип:

@mixin({ 
    zip: 7, 
    bar: 'zaz' 
}) 
class Zoo extends Foo { 
    zip: number; 
} 

const zoo = new Zoo; 
console.log(zoo.zip, zoo.bar, foo.bar); 
// prints 7 zaz baz 
Смежные вопросы