js问题
function foo() {this.a = 100;
this.b = 200;
}
function goo() {
this.c = 300;
this.d = 400;
}
var seed = new foo(); //1
foo.prototype.fuss = function(fn) {
fn.prototype = seed;
seed = new fn; //2
return this; //3
}
var a = seed.fuss(goo);
console.log(a.c);
console.log(a === seed);
console.log(seed.a);
能解释一下输出结果的原因吗,没看懂,想了很久就是不知道输出结果 本帖最后由 hu_sa 于 2021-3-30 00:46 编辑
很有意思的题目,个人理解,欢迎指正讨论:
function foo() {
this.a = 100;
this.b = 200;
}
function goo() {
this.c = 300;
this.d = 400;
}
var seed = new foo();
//1
foo.prototype.fuss = function(fn) {
fn.prototype = seed;//prototype 很特殊,特殊到需要仔细研究,结合下面的参数,这里可以理解为直接prototype赋值为上面定义的对象seed,有些说这样的赋值无效,但是就是奇怪的可以
seed = new fn; //seed 为new goo(),也就是{c: 300,d: 400, prototype: foo:{a: 100,b: 200}
//2
return this; //这里是重点,实际返回的原型对象,而不是seed实例,可以理解为就是继承的对象,一个隐藏的~哎,底层也不是很懂。。。
//原型对象内部也有一个指针(constructor属性)指向构造函数:foo.prototype.constructor = foo;
//3
}
var a = seed.fuss(goo);
console.log(a.c); //undefined
console.log(a === seed); //false
console.log(seed.a); //100
把16行中返回seed,哈哈就是true咯,很值得深入研究的题目。 hu_sa 发表于 2021-3-30 00:36
很有意思的题目,个人理解,欢迎指正讨论:
function foo() {
this. ...
seed.__proto__ === a
是不是这样输出的就是true superb_fsj 发表于 2021-3-30 08:56
seed.__proto__ === a
是不是这样输出的就是true
是的,你还是很厉害的哈! hu_sa 发表于 2021-3-30 09:04
是的,你还是很厉害的哈!
没,我就是个菜鸡,这题想了很久,昨天把内存图画了之后才懂了原型链,但是不懂为啥this返回的是原来的seed hu_sa 发表于 2021-3-30 09:04
是的,你还是很厉害的哈!
我好像懂了var a = seed.fuss(goo),这时候this指向的是seed但这个seed是原来的seed执行到seed = new fn;的时候seed才变成了goo的实例对象所有a===seed是false。 是这样理解吗 原型链了解一下
页:
[1]