Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/457.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在不使用对象文字值的情况下从setter访问表单数据?_Javascript_Javascript Objects - Fatal编程技术网

Javascript 如何在不使用对象文字值的情况下从setter访问表单数据?

Javascript 如何在不使用对象文字值的情况下从setter访问表单数据?,javascript,javascript-objects,Javascript,Javascript Objects,我需要将setter添加到以下JavaScript模块: 在下面的代码中,我只是将表单数据返回给模块对象。 我需要添加setter功能,这样我就可以对用户输入进行最少的检查 var Mod = (function(){ var module = {}; var element = document.forms.[0]; Object.defineProperty(module, 'Country', { get: function () {

我需要将setter添加到以下JavaScript模块:

在下面的代码中,我只是将表单数据返回给模块对象。 我需要添加setter功能,这样我就可以对用户输入进行最少的检查

var Mod = (function(){

    var module = {};
    var element = document.forms.[0];

    Object.defineProperty(module, 'Country', {

        get: function () {

            return element.txtCountry.value;            
        }

    });

        Object.defineProperty(module, 'City', {

        get: function () {

            return element.txtCity.value;           
        }

    });

    return module;

})();
但是,我遇到的所有示例(包括MDN上的示例)都显示了一个具有文本值的对象:

像这个:

var module = {

  Country: "United States",

  get function() { 

    return this.Country;

  },

  set function(x) {

    this.Country = x + ' ' + somethingElse;
  }

};
如何添加setter以将数据返回到没有文本对象成员的对象

最后,我这样调用模块:

var btn = document.getElementById( 'btnDataEntry' );
var result = document.getElementById('result');

btn.addEventListener('click', function(e) {

    var t = document.createTextNode(Mod.Country + ',' + Mod.City);  

    result.appendChild(t);

    e.preventDefault();
}, false);
更新(其他信息): 以最简单的形式,我希望在
setter
中执行检查,如下所示:

var btn = document.getElementById( 'btnDataEntry' );
var result = document.getElementById('result');

btn.addEventListener('click', function(e) {

    var t = document.createTextNode(Mod.Country + ',' + Mod.City);  

    result.appendChild(t);

    e.preventDefault();
}, false);
更新:(解决方案)。

因此,尽管这看起来很简单,但它可能会变得混乱,因为JavaScript在如何完成特定任务方面更加抽象

问题是,在
对象.defineProperty()
方法中使用setter时,必须使用点表示法将值传递给对象,还必须使用函数范围内的变量来模拟私有成员

如果查看我以前的代码,您将看到我直接在
getter
中传递表单数据,这违背了使用
getter/setter
的全部目的

这是一个完整的工作代码:基于Nicholas C.Zakas的《面向对象JavaScript的原理》一书中的阅读资料和示例

代码:


在定义getter的相同
defineProperty
调用中定义setter:

Object.defineProperty(module, 'City', {

        get: function () {

            return element.txtCity.value;           
        },
        set: function (value) {
            // do minimal check
            element.txtCity.value = value;           
        }

    });

在定义getter的相同
defineProperty
调用中定义setter:

Object.defineProperty(module, 'City', {

        get: function () {

            return element.txtCity.value;           
        },
        set: function (value) {
            // do minimal check
            element.txtCity.value = value;           
        }

    });

为什么您不能在
defineProperty
中使用相同的方法?我尝试过使用代码并引用MDN,但正如我所指出的,我所阅读的所有示例都只是显示了文本值,与表单数据没有关联。我不明白您在尝试(或失败)做什么。你能告诉我你想要什么吗?您想得到什么用法?请参阅更新:谢谢。除此之外,您所需的代码中存在一些混乱(
返回国
毫无意义,
val=element…
可能是另一种情况),我仍然不明白问题是什么。为什么你不能在
defineProperty
中使用相同的方法呢?我尝试过使用代码并引用MDN,但正如我所指出的,我读到的所有示例都只显示了文本值,与表单数据没有联系。我不明白你在尝试(和失败)做什么。你能告诉我你想要什么吗?您试图获得什么用途?请参阅更新:谢谢。除此之外,您所需的代码中存在一些混乱(
返回国
毫无意义,
val=element…
可能是另一种情况),我仍然不知道问题出在哪里。我在对什么执行验证?无论我在哪里检查,我仍然会得到相同的返回数据,使用
if语句。
我对什么执行验证?无论我在哪里检查,我仍然会使用
if语句返回相同的数据。