Javascript JS是否可以将getter和setter方法命名为与属性相同的方法?

Javascript JS是否可以将getter和setter方法命名为与属性相同的方法?,javascript,setter,getter,Javascript,Setter,Getter,我想实现代码中的行为: function Foo(name) { this.name = name; }; var myFoo = new Foo('myName'); myFoo.name('newMyName'); // sets myFoo.name = 'newMyName' myFoo.name(); // returns 'myName' 但很明显,在这种情况下,我将用name函数覆盖name属性。无论如何都有可能实现该功能吗?在javascript中谈论getter和

我想实现代码中的行为:

function Foo(name) {
    this.name = name;
};

var myFoo = new Foo('myName');

myFoo.name('newMyName'); // sets myFoo.name = 'newMyName'
myFoo.name(); // returns 'myName'

但很明显,在这种情况下,我将用name函数覆盖name属性。无论如何都有可能实现该功能吗?

在javascript中谈论getter和setter时,您可能会谈论以下两个概念之一:

1.getter和setter作为一个概念,与任何其他OO语言中的概念一样。 这就是您问题中的代码所说明的情况。在这种情况下,一个对象的属性就是一个简单的属性,一个可以或者是对象或者函数的属性。javascript在同一名称空间中跟踪这两个名称。事实上,函数只是javascript中的对象,所以对于像C这样的语言中的函数,没有单独名称空间的概念

在本例中,“getter”和“setter”只是常规函数,因此值需要单独存储。围绕这一点,有几种策略

一种是使用Java中常见的隐式
getSomething()
setSomething()
样式的函数。这允许您从属性名称中消除getter和setter的歧义,因为getter和setter在名称中添加了单词“get”和“set”

第二个策略是你在问题中写的策略。在这种情况下,您需要以另一个名称存储属性,以便不与getter/setter共享相同的名称

第三种策略是在闭包中存储值:

    function Foo (name) {
        var name = name;
        this.name = function (str) {
            if (str !== undefined) name = str;
            return name;
        }
    }
注意,在上面的代码中,值存储在
name
中,但getter/setter是
this.name
,这是一个完全不同的变量。这允许示例代码按预期工作:

    var me = new Foo('Mark');
    me.name(); // returns Mark
    me.name('Andy'); // sets name to Andy
2.getter和setter作为javascript中的一种机制。 这是遵循ECMAscript 5规范的较新版本javascript的一个特性。此功能允许属性在读取或写入代码时执行代码,类似于DOM对象的
.innerHTML
属性在为其分配内容时调用HTML解析器的方式

getter和setter的语法与函数类似,但引入了
get
set
关键字来代替
function

具有getter和setter的属性的简单示例:

    var me = {
        first_name : "",
        last_name : "",
        get name() {
            return this.first_name + " " + this.last_name;
        },
        set name(str) {
            var n = str.split(/\s+/);
            this.first_name = n.shift();
            this.last_name = n.join(' ');
        }
    }
上面的代码允许您将函数视为变量而不是函数来获取和设置
first\u name
last\u name
。要使用
名称
getter和setter,只需执行以下操作:

    me.name = "James Bond";
    alert(me.first_name); // should alert James
    alert(me.last_name); // should alert Bond
    me.last_name = "Dean";
    alert(me.name); // should alert James Dean
使用javascript获取/设置机制,不能使用相同的名称将值存储在对象中。例如:

    var foo = {
        set bar(x) {this.bar=x}
    }

上面的代码将编译,但试图设置bar:
foo.bar=1
将由于无限循环而导致堆栈溢出-setter中的
this.bar=
将再次调用setter。

为什么不使用另一个名称来存储实际字符串(例如
.name2
),并将
.name
作为函数,然后定义函数中的其他属性?我想你可以。尽管如此,这正是我一直在寻找的。问题是属性和方法(get/set)共享相同的作用域。@slebetman我喜欢这个答案。两个问题:1。因此,这两个概念之间除了使用()或不使用()来触发getter/setter之外,没有其他好处(如果对第一个概念使用第二种策略)?2.如果创建一个对象的新实例,有没有一种方法可以自动运行对象的set机制?我想知道JS中的Document对象是如何工作的,有很多getter/setter属性,比如,children,title,等等。当我在Chrome控制台中浏览它时,我可以看到getter/setter具有相同的名称。@PawełDOM对象通常是用C实现的,而不是用js实现的。在实现getter/setter API之前,已经存在类似getter/setter的行为。事实上,创建getter/setter API是为了允许您模拟DOM属性(如innerHTML)的行为,这在以前是不可能的