function superClass(name, age){ this.name = name; this.age = age; this.test = "1111" } superClass.prototype = { consturct: superClass, init: function () { console.log("this is superClass init"); } } function subClass (name, age, job) { superClass.call(this, name, age); this.job = job; this.test = "22222"; } subClass.prototype = new superClass(); subClass.prototype.init = function init () { console.log(this.job); } var s = new superClass("zhanghao", 22); console.log(s.test); // "1111" s.test = "wo gai le a"; console.log(s.test); // "wo gai le a" delete(s.test); console.log(s.test); // undefined var ss = new subClass("haha", 22, "av nan you"); console.log(ss.test); // "22222" ss.test = "qtmlgb"; console.log(ss.test); // qtmlgb delete(ss.test) console.log(ss.test); // "1111" delete(ss.test); console.log(ss.test); // "1111"
谁能讲解一下这个奇葩现象...
1 bluec 2015-01-05 16:03:27 +08:00 不知道你说的奇葩现象是什么?是指delete(ss.test)之后还能打印11111?你只要仔细研究一下js的原型链就明白了。 |
![]() | 2 Mutoo 2015-01-05 16:46:20 +08:00 如果一个对象的属性不存在,js会尝试在 prototype 中查找该属性。一直找到最上游,直到找到或者不存在。 |
![]() | 4 haozhang OP @Mutoo 你没仔细看我的代码,原型链这种基础知识...我是知道的。我在this上添加的属性,只能说明this上添加了属性和prototype里面的属性有点不一样 |
![]() | 6 haozhang OP @bluec 按原型链的说法,我第一次delete(ss.test) log出来的应该是22222而不是1111 |
![]() | 7 haozhang OP @Mutoo 我用this.test=22222,不是prototype.test=22222。这test属性压根不应该在原型链里面。但是ss.test在delete之后竟然可以搜索到父类的test...但是父类的test根本不是自身原型的属性 |
8 novaeyoucom 2015-01-05 17:09:10 +08:00 ![]() js的delete有很多限制, 继承来的属性不能被删除是之一, 举个栗子: 一个人觉得老爹的房子户型很傻逼,看着就闹心,不想要但也不能给砸了,否则自家其他兄弟能把他打出屎来。 |
![]() | 9 haozhang OP @novaeyoucom 原来如此。我去研究研究delete-_-# |
![]() | 12 haozhang OP @laike9m 上面代码就说明了,删除了子类对象的test属性就暴露出了父类的test属性,即便这个test属性是在构造函数中this.test=1111而不是superClass.prototype.test=1111 |
![]() | 13 Mutoo 2015-01-05 19:02:15 +08:00 ![]() @haozhang 你的理解还是错的。 你在执行 subClass.prototype = new superClass(); 的时候,实际上创建了一个带 test 属性的对象,并赋值给 subClass 的 原型,也就是说这时候: subClass.prototype = {test: "1111", /* other...*/} superClass.prototype.test 确实是 undefined 没错,但 subClass.prototype.test 却是实打实的 1111 |