javascript - 在原型链和class中定义getter&setter有什么不同?
阿神
阿神 2017-04-11 12:57:50
[JavaScript讨论组]

有这样一小段程序,描述了两个类,每个类都有一对 getter&setter 属性:

  • Test1 是在 原型链 上定义的;

  • Test2 是用 ES6 中定义的;


// Test1
function Test1(val) {
  alert("1");
  this.value = val;
}
Test1.prototype = {
  get value() {
    alert("2");
    return this._value;
  },
  set value(val) {
    alert("3");
    this._value = val;
  }
};

var f1=new Test1("zj");
f1.value="sdf";
console.log(f1);

运行结果是:
弹出: 1 3 3 2;
输出:

[object Object] {
  _value: "sdf",
  value: "sdf"
}

// Test2
class Test2{
  constructor(val){
    alert("1");
    this.value = val;
  }
  get value(){
    alert("2");
    return this._value;
  }
  set value(v){
    alert("3");
    this._value=v;
  }
}

var f2=new Test2("zj");
f2.value="sdf";
console.log(f2);

运行结果是:
弹出: 1 3 3;
输出:

[object Object] {
  _value: "sdf"
}

可以看到这两种方式定义的getter&setter结果是不一样的,请问是为什么呢?

阿神
阿神

闭关修行中......

全部回复(1)
黄舟

经过测试,在babel中转化后 test1 和 test2 是一样的的结果,题目中描述的结果是出现在jsbin上的,所以可能和他们的编译环境相关,两者不应该是有区别的,因为es6的类实现的过程相当于:

var Person = function(name) {
    this.name = name;
}
var p = new Person();

// 分解为:
var p = {}
p.__proto__ = Person.prototype
Person.call(p)
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号