Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.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 - Fatal编程技术网

Javascript 为什么这里需要setter?

Javascript 为什么这里需要setter?,javascript,Javascript,HTML代码段 <div id="container"> <span class="no"></span> <span class="yes"></span> <span class="no"></span> <span class="no"></span> </div> 但是,如果我添加一个空的setter,它可以正常工作: clas

HTML代码段

 <div id="container">

    <span class="no"></span>
    <span class="yes"></span>
    <span class="no"></span>
    <span class="no"></span>

 </div>
但是,如果我添加一个空的setter,它可以正常工作:

class Something{
    constructor(){
        this.elem = container;
    }

    get childYes(){
        let span = this.elem.querySelector(".yes");
        this.childYes = span;
        return span;
    }   
    set childYes(a){};
}


var object = new Something();
console.log(object.childYes); // <span class="yes"></span>
我不需要一个setter,browser到底想从我这里得到什么

无法设置只有getter的属性clientName

通过这样做。childYes=。。。在定义为访问器的属性上,尝试使用setter。要定义实例上的属性,请使用Object.defineProperty:

分类{ 建造师{ this.elem=容器; } 带孩子来是的{ console.logGetter-ran; 设span=this.elem.querySelector.yes; Object.defineProperty这个孩子是的{ 值:span }; 返回跨度; } } var对象=新事物; console.logobject.childYes;//运行getter console.logobject.childYes;//使用数据属性 无法设置只有getter的属性clientName

通过这样做。childYes=。。。在定义为访问器的属性上,尝试使用setter。要定义实例上的属性,请使用Object.defineProperty:

分类{ 建造师{ this.elem=容器; } 带孩子来是的{ console.logGetter-ran; 设span=this.elem.querySelector.yes; Object.defineProperty这个孩子是的{ 值:span }; 返回跨度; } } var对象=新事物; console.logobject.childYes;//运行getter console.logobject.childYes;//使用数据属性
因为这个.childYes=。。。打电话给二传手,你想在这里实现什么?为什么你会有这个。childYes=span;line?@NiettheDarkAbsol-有些人喜欢使用这个“如果我需要它,就获取一次”行为,在第一次使用时将访问器转换为数据属性。@T.J.Crowder啊,这是一种懒惰的评估工作。事实上,这是一个巧妙的技巧,尽管在这种情况下它确实感觉像是一个微优化。。。打电话给二传手,你想在这里实现什么?为什么你会有这个。childYes=span;line?@NiettheDarkAbsol-有些人喜欢使用这个“如果我需要它,就获取一次”行为,在第一次使用时将访问器转换为数据属性。@T.J.Crowder啊,这是一种懒惰的评估工作。实际上,这是一个巧妙的技巧,尽管在这种情况下它确实感觉像是一个微观优化。因此,如果我错了,请纠正我:调用object.childYes后,程序首先查找object的own.childYes属性;失败;走向原型;找到getter;开始执行getter,当行'this.childYes=span;`似乎程序在此处查找它(例如在原型中),但失败了,对吗?@IgorCheglakov-我已更新了答案以回答您的评论:-所以,如果我错了,请纠正我:调用object.childYes后,程序首先查找object的own.childYes属性;失败;走向原型;找到getter;开始执行getter,当行'this.childYes=span;`似乎程序在此处查找它(例如在原型中),但失败了,对吗?@IgorCheglakov-我已更新了答案以回答您的评论:-
class Something{
    constructor(){
        this.elem = container;
    }

    get childYes(){
        let span = this.elem.querySelector(".yes");
        this.childYes = span;
        return span;
    }   
    set childYes(a){};
}


var object = new Something();
console.log(object.childYes); // <span class="yes"></span>
get childYes(){
    let span = this.elem.querySelector(".yes");
    Object.defineProperty(this, "childYes", {
        value: span
    });
    return span;
}