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 1
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 1
@haozhang 你的理解还是错的。
你在执行 subClass.prototype = new superClass(); 的时候,实际上创建了一个带 test 属性的对象,并赋值给 subClass 的 原型,也就是说这时候: subClass.prototype = {test: "1111", /* other...*/} superClass.prototype.test 确实是 undefined 没错,但 subClass.prototype.test 却是实打实的 1111 |