2013-11-03 2 views
0

Есть ли способ остановить экземпляры функции от наследования свойства друг от друга? Я читал статью о объекте прототипа Javascripts и читал следующее.Вопрос о наследовании и прототипе Javascript и прототипа

«Важно отметить, что прототип« живой ». Объекты передаются по ссылке в JavaScript, поэтому прототип не копируется с каждым экземпляром нового объекта. Что это означает на практике? Это означает, что вы можете модифицируйте прототип в любое время, и все объекты (даже созданные до модификации) наследуют изменения ».

Есть ли способ предотвратить обновление всех объектов. Я хотел бы, чтобы свойство каждого экземпляра было уникальным. Если нет других способов назначения функций функции? Вот код, с которым я работаю. Это позволяет мне отображать анимированные спрайты в файле three.js, но когда я создаю новые экземпляры функции, экземпляры переходят к кадру, из которого обращается новый экземпляр. Таким образом, все отображает один и тот же фрейм. Я подумал, могу ли я повернуть наследование. Все должно быть хорошо. Извините, если это небрежно, я удалил кучу вещей, которые не нужны для вопроса.

function slowToStopFunc(texture, tilesHoriz, tilesVert, numTiles, tileDispDuration) { 
     this.tilesHorizontal = tilesHoriz; 
     this.tilesVertical = tilesVert; 
     this.numberOfTiles = numTiles; 
     texture.wrapS = texture.wrapT = THREE.RepeatWrapping; 
     texture.repeat.set(1/this.tilesHorizontal, 1/this.tilesVertical); 
     this.tileDisplayDuration = tileDispDuration; 
     this.currentDisplayTime = 0; 
     this.currentTile = 3;    
      this.update3 = function(milliSec3) { 
      this.currentDisplayTime += milliSec3; 
      while (this.currentDisplayTime > this.tileDisplayDuration && adjustSpeed <= 2) 
      { 
     if (this.currentTile >= -1 && this.currentTile <= 14) { 
      this.currentTile++; 
      } 
     } 
     var currentColumn = this.currentTile % this.tilesHorizontal; 
     texture.offset.x = currentColumn/this.tilesHorizontal; 
     var currentRow = Math.floor(this.currentTile/ this.tilesHorizontal); 
     texture.offset.y = currentRow/this.tilesVertical; 
     }  
     } 
+0

может глубоко скопировать объект и тем самым будет автономным .... это то, что вы хотите? Образец того, что вы пытаетесь добиться, был бы полезен – charlietfl

+0

@charlietfl Да, извините, я должен был положить это туда для начала. О чем говорят ваши слова. – Kahless

+0

, так что вы говорите, когда пытаетесь «new slowToStopFunc», он реагирует на другие случаи? Это потому, что 'slowToStopFunc' является частью более крупного объекта? – charlietfl

ответ

0

Характер прототипального наследования позволяет вам это делать, поскольку поиск свойств работает.

Когда поиск недвижимости происходит:

  1. ли объект имеет SomeProperty? Если да, то возвратите someProperty.
  2. Если у объекта нет someProperty, проверьте его прототип цепи и выполните ту же логику до тех пор, пока не будет прототип ссылки null.

В принципе, это означает, что настройка объекта на объекте будет теневым, наследуемое значение естественно.

function A() { 
} 

A.prototype.test = 'test'; 

var a = new A(); 

a.test = 'test 2'; 

console.log(a.test); //not test anymore 

Однако, если вы спрашиваете, если это возможно, чтобы изменить прототип конструктора, не затрагивая существующие экземпляры, это возможно, но я не знаю, почему вы хотели бы сделать это.

В принципе, вам просто нужно заменить весь экземпляр прототипа, чтобы вновь созданные экземпляры имели целый новый объект-прототип.

function A() {} 

A.prototype.test = 'test'; 

var a = new A(); 

A.prototype = { 
    constructor: A, 
    test: 'new value' 
}; 

console.log(a.test); //test 

console.log(new A().test); //new value 
+0

Спасибо за пример кода.У меня есть способ заменить весь экземпляр прототипа при определении свойства, используя это. и вызывает функцию last при использовании некоторой вещи, такой как var Playanimation = new slowToStopFunc (текстура, плиткиHoriz, tilesVert, numTiles, tileDispDuration) { – Kahless

+0

@JohnBob Не могли бы вы немного подробнее перейти на «перейти к кадру, с которого обращается новый экземпляр», и также покажите, как вы внедряете свои материалы и какие свойства должны быть уникальными для каждого экземпляра. Благодаря! – plalx

+0

Я пытаюсь использовать приведенный выше код для воспроизведения анимации в three.js. Он отлично работает, если я не добавлю больше одной анимации. Кажется, что каждый экземпляр анимации обновляет друг друга. В моем коде у меня есть строка this.update3 = function (milliSec3) {. Затем письмо я вызываю slowToStopFunc.update (1000 * delta); Я думаю, каждый раз, когда каждый экземпляр обновляется, он обновляет их все. – Kahless

0

Вы пытались переопределить унаследованные свойства? Не уверен, насколько вы знакомы с наследованием объектов, но в целом вы можете написать над унаследованными свойствами, сопоставив имя свойств.

+0

Хмм интересно. Как я могу использовать переопределяющие свойства? – Kahless

Смежные вопросы