2010-11-12 159 views

回答

9

JavaScript不使用函数来设置属性。它们只是变量,并且设置它们不需要任何复杂的包装。

可以用一个函数来设置该属性,虽然 - 同一类你可能在类中支持私有数据的语言使用的getter/setter安排。这样你的函数可以很容易地运行其他已经注册为回调的函数。使用jQuery你甚至可以把它们作为事件来处理。

$(yourObject).bind('some-event-you-made-up', function() { 
    // This code will run whenever some-event-you-made-up is triggered on yourObject 
}); 

// ... 

$(yourObject).trigger('some-event-you-made-up'); 
+3

它实际上是可能的,这对于在对象属性“getter”和“二传手”的作用Mozilla扩展的Javascript。 – Pointy 2010-11-12 22:44:38

+4

或在ECMAScript 5中。 – casablanca 2010-11-12 22:53:29

+0

问题是我想监听事件的对象不是一个jquery对象,而只是一个存储在jquery对象数据对象中的通用对象。我不知道如何将事件绑定到它。 – joshontheweb 2010-11-12 23:09:22

3

也许你已经解决了使用jQuery绑定/触发你的问题,但我想告诉大家,我建立一个更改跟踪和(在此之上)实体建模的JavaScript框架,命名为“帐篷”,解决了你曝光,而无需对对象操作,其开源任何特殊语法和托管的问题:

https://github.com/benjamine/tent

它的记录与JSDoc和单位用JS测试驱动器测试。

您可以使用更改跟踪模块是这样的:

var myobject = { name: 'john', age: 34 }; 

    // add a change handler that shows changes on alert dialogs 
    tent.changes.bind(myobject, function(change) { 
     alert('myobject property '+change.data.propertyName+' changed!'); 
    }); 

    myobject.name = 'charly'; // gets notified on an alert dialog 

它与阵也发生了变化(添加,删除)。 此外,您可以使用“实体”上下文来保持所有检测到的更改(添加,删除,修改项目)的集合上的变更集,级联添加和删除,保持反向属性同步,跟踪1对1, N和N对-M的关系,等等。

+0

这是一个非常有趣的框架。 – 2013-06-23 19:34:04

0

你可以尝试Javascript Property Events (jpe.js)

我遇到过类似的问题,并最终编写Object.defineProperty,增加了事件处理程序的属性过载功能。它还提供了类型检查(js-base-types)并在内部存储它的值,以防止不必要的更改。

样品正常defineProperty的:

Object.defineProperty(document, "property", { 
    get:function(){return myProperty}, 
    set:function(value){myProperty = value}, 
}) 
var myProperty = false; 

的财产样品与onchange事件:

Object.defineProperty(document, "property", { 
    default:false, 
    get:function(){}, 
    set:function(value){}, 
    onchange:function(event){console.info(event)} 
}) 
+0

我很震惊地在那里看到一个“onchange”事件,但后来我看到它是一个框架哈哈 – 2017-07-22 04:04:56

0

对象defineProperty /的DefineProperties的伎俩。 这里有一个简单的代码。我已经建立了一些数据,根据该绑定框架,它可以变得很复杂,但行使这样的:

var oScope = { 
    $privateScope:{}, 
    notify:function(sPropertyPath){ 
     console.log(sPropertyPath,"changed"); 
    } 
}; 
Object.defineProperties(oScope,{ 
    myPropertyA:{ 
     get:function(){ 
      return oScope.$privateScope.myPropertyA 
     }, 
     set:function(oValue){ 
      oScope.$privateScope.myPropertyA = oValue; 
      oScope.notify("myPropertyA"); 
     } 
    } 
}); 

oScope.myPropertyA = "Some Value"; 
//console will log: myPropertyA changed