Javascript 尝试创建具有相同名称的方法和属性

Javascript 尝试创建具有相同名称的方法和属性,javascript,knockout.js,Javascript,Knockout.js,尝试使用相同名称的方法和属性: 作为用于访问值的属性:if(myObject.propMethod()==queryVal) 用于分配给propMethod的方法:myObject.propMethod(newVal) 我定义了以下内容: // the property: myObject.propMethod = ko.observable(); // disregard the knockout 'ko' for this question

尝试使用相同名称的方法和属性:

作为用于访问值的属性:
if(myObject.propMethod()==queryVal)
用于分配给propMethod的方法:
myObject.propMethod(newVal)

我定义了以下内容:

        // the property: 
        myObject.propMethod = ko.observable();   // disregard the knockout 'ko' for this question  
        // the method: 
        myObject.prototype.propMethod = function (value) {
            myObject.propMethod = value;
            return target; // supports chaining
        };
缺乏经验和对javascript的接触:它似乎在工作,但我想验证一下是否有什么我没有解释的


编辑:根据下面的注释,似乎我的作业实际上调用了knockout的函数,所以我的“原型”从未执行过。如何获得允许我在赋值时执行附加逻辑的结构?

您不需要单独使用属性和方法来为属性赋值

直接分配给它

        // the property: 
    myObject.propMethod = ko.observable(); 
    // the method: 
    myObject.propMethod = value;

在这种情况下,Knockout必须使其可观察(对于双向绑定,在更改值时更新。)因为Knockout使其成为一种可观察的方法,所以必须在属性名称后放置()来读取Knockout observable属性

A Knockout
observable
是它所属的ViewModel的一种方法;它是一个getter/setter,所以你可以完全按照你在第二段中描述的方式使用它。您不需要做任何特殊的事情来启用此行为;它是内置的

如果您试图独立于敲除实现此效果,只需创建一个getter/setter工厂函数:

function getterSetter(initVal) {
  var myValue=initVal; //Closures are cool!
  return function(val) {
    if (typeof val !== 'undefined') {
      myValue = val;
    }
    return myValue;
  }
}
然后

var myObject = {};
myObject.propMethod = getterSetter();
myObject.anotherPropMethod = getterSetter('hello');
...
myObject.propMethod('world');
alert(myObject.anotherPropMethod()+' '+myObject.propMethod();
myObject.anotherPropMethod('goodbye');
alert(myObject.anotherPropMethod()+' '+myObject.propMethod();

你说忽略敲除位,但将
属性
设置为可观察到的敲除将使其成为一个函数,并设置你调用的函数传递的值,这样你的代码就不会按你的意愿工作。
prototype
创建一个属性,该属性也将出现在其他新对象中。@richarddallon,因此,在我的赋值调用
myObject.propMethod(newVal)
中,我实际上调用了ko函数来完成赋值。我猜,当完成时,它会返回原始的可观察状态(就像我的“原型”尝试一样),因此链接是可能的,并且一切看起来都正常。我编辑了这个问题,询问如何完成一个也执行我的自定义逻辑的任务(不仅仅是ko可以观察到的东西。我在寻找一个真正的属性/方法行为-我需要执行额外的逻辑。你说的真正的属性/方法行为是什么意思?如果你能在JSFIDDLE中创建一个演示就好了。我指的是在每个“get”或“set”上执行的额外代码);getter和setter允许您执行其他代码,而不是获取和设置值。