0

有没有办法阻止函数的实例相互继承属性?我正在阅读一篇关于 Javascripts 原型对象的文章并阅读了以下内容。

“重要的是要注意原型是“活的”。对象在 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;
        }    
        }
4

2 回答 2

0

您是否尝试过覆盖继承的属性?不确定您对对象继承有多熟悉,但通常您可以通过匹配属性名称来覆盖继承的属性。

于 2013-11-03T00:38:47.287 回答
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
于 2013-11-03T00:42:26.190 回答