-
Notifications
You must be signed in to change notification settings - Fork 3.3k
第 100 题:请写出如下代码的打印结果 #155
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Comments
结果如下
|
输出顺序是 4 2 1 . function Foo() {
Foo.a = function() {
console.log(1)
}
this.a = function() {
console.log(2)
}
}
// 以上只是 Foo 的构建方法,没有产生实例,此刻也没有执行
Foo.prototype.a = function() {
console.log(3)
}
// 现在在 Foo 上挂载了原型方法 a ,方法输出值为 3
Foo.a = function() {
console.log(4)
}
// 现在在 Foo 上挂载了直接方法 a ,输出值为 4
Foo.a();
// 立刻执行了 Foo 上的 a 方法,也就是刚刚定义的,所以
// # 输出 4
let obj = new Foo();
/* 这里调用了 Foo 的构建方法。Foo 的构建方法主要做了两件事:
1. 将全局的 Foo 上的直接方法 a 替换为一个输出 1 的方法。
2. 在新对象上挂载直接方法 a ,输出值为 2。
*/
obj.a();
// 因为有直接方法 a ,不需要去访问原型链,所以使用的是构建方法里所定义的 this.a,
// # 输出 2
Foo.a();
// 构建方法里已经替换了全局 Foo 上的 a 方法,所以
// # 输出 1 |
4 2 1 |
1 similar comment
4 2 1 |
4 |
421
|
4 2 1 |
1 similar comment
4 2 1 |
输出顺序:4,2,1 |
function Foo() {
Foo.a = function() {
console.log(1)
}
this.a = function() {
console.log(2)
}
}
Foo.prototype.a = function() {
console.log(3)
}
Foo.a = function() {
console.log(4)
}
Foo.a();
let obj = new Foo();
obj.a();
Foo.a(); 答案: 4、2、1 Foo.a() 第一个为4没有什么异议 |
4,2,1 |
4,2,1 |
function Foo() {
Foo.a = function() {
console.log(1)
}
this.a = function() {
console.log(2)
}
}
// 实例方法
Foo.prototype.a = function() {
console.log(3)
}
// 静态方法
Foo.a = function() {
console.log(4)
}
Foo.a(); // 4 直接调Foo静态方法a
let obj = new Foo();
obj.a(); // 2 因是obj调用,故优先调用构造函数Foo自身的方法a,如果自身没有则执行原型链上的方法a
Foo.a(); // 1 因执行了一次new 操作,故再次调用Foo.a()时调用了Foo函数体内的静态方法a |
|
function Foo() { |
那些只说结果不去分析的,有啥意义。。 |
// 定义一个构造函数Foo |
答案为:4, 2, 1
|
421 |
1 similar comment
421 |
// 构造函数Foo
function Foo() {
Foo.a = function() {
console.log(1)
}
this.a = function() {
console.log(2)
}
}
// 在构造函数Foo的原型上添加a方法
Foo.prototype.a = function() {
console.log(3)
}
// 在构造函数Foo上添加a方法
Foo.a = function() {
console.log(4)
}
// 直接调用Foo.a()方法
Foo.a();
// 实例化, 会执行构造函数
// 实例化所在事情:在Foo上添加a方法,在新建实例上添加a方法,在Foo的原型上添加a方法
let obj = new Foo();
//执行Foo的实例obj的方法a
obj.a();
// 执行Foo的方法a
Foo.a(); |
function Foo() {
Foo.a = function() {
console.log(1)
}
this.a = function() {
console.log(2)
}
}
Foo.prototype.a = function() {
console.log(3)
}
Foo.a = function() {
console.log(4)
}
Foo.a(); // 调用构造函数的自身的方法 ,所以结果是4
let obj = new Foo(); // new重新创建一个obj,使它指向Foo,拥有了构造函数的属性和方法
obj.a(); // 因为构造函数有直接方法,所以输出2
Foo.a(); // 构造函数重新全局a方法,所以结果结果是1,之前是4
// 结果是4、2、1 |
|
4 |
这个我会,来声个张, |
421~ 接下来new了一下构造函数~ |
2楼的解完美 |
`Foo.a(); // 4 全局的Foo.a let obj = new Foo(); // 执行Foo的构造函数,将 最后的 Foo.a(全局)覆盖 obj.a(); // 2 this.a Foo.a(); // 1 Foo构造函数里的 foo.a 因为全局的已经被覆盖 |
京东怎么总喜欢出这种乱七八糟的题 |
421 function Foo() {
Foo.a = function() {
console.log(1);
};
this.a = function() {
console.log(2);
};
}
// 原型方法,在生成实例时使用
Foo.prototype.a = function() {
console.log(3);
};
// 静态方法,可以直接调用
Foo.a = function() {
console.log(4);
};
Foo.a(); // 实例没有生成,直接调用静态方法,输出4
let obj = new Foo();
obj.a(); // 实例中有a,不去原型链中查找,之前在Foo.prototype.a的函数也被覆盖,输出2
Foo.a(); // 生成实例后,Foo原型链中的静态方法被覆盖,输出1 |
这道题很好的讲述了构造函数中,new做的事情: |
在Foo上添加了一个a函数,js中万物皆函数,所以就相当于在Foo这个对象上添加了一个新的属性a,并赋值为一个函数。要注意的是,这并不会对Foo构造(new)出来的对象造成影响。 Foo.a() 执行了上面定义的函数 console.log(4)
new 相当于创建一个新对象,用Foo对其进行构造,题目中Foo中对obj有影响的只有this.a = ... obj的__proto__也会指向其构造函数Foo的原型Foo.prototype 所以当obj中查找的属性不存在时,顺着__proto__到Foo.prototype中去找,还找不到就去Object.prototype中找。 同样Foo(),说明Foo被执行了一次。
由于obj自身拥有a,所以会执行console.log(2) 再此执行全局作用域中的Foo.a 因为Foo()执行了对Foo.a的修改,所以console.log(1)` |
思路: function Foo() {
Foo.a = function() {
console.log(1)
}
this.a = function() {
console.log(2)
}
}
Foo.prototype.a = function() {
console.log(3)
}
Foo.a = function() {
console.log(4)
}
Foo.a(); //由于Foo未初始化,所有不会执行构造函数中代码,所有调用的是外面的Foo.a,输出4
let obj = new Foo(); // 执行构造函数,`this.a`被执行
obj.a(); // 由于在Foo构造函数中存在`this.a`,所以此时不会向上查找原型链上的a函数,执行`this.a`中代码
Foo.a(); // 构造函数被执行,Foo.a被新的代码覆盖,此时Foo.a为构造函数内部的赋值,输出1 结果:4,2,1 |
100题达成 前面又忘了(bushi)。。。 |
打印顺序 4 2 1 function Foo() {
Foo.a = function() {
console.log(1)
}
this.a = function() {
console.log(2)
}
}
// 给Foo类的实例的原型增加名为a的属性,打印3
Foo.prototype.a = function() {
console.log(3)
}
// 给Foo对象增加一个名为a的属性,打印4
Foo.a = function() {
console.log(4)
}
// 调用Foo对象的a方法,输出4
Foo.a();
// 实例化Foo类为obj对象,此时Foo构造函数被调用
// Foo对象的a属性被替换为打印1的函数
// 实例方法a被赋值为一个打印2的函数
let obj = new Foo();
obj.a(); // 2
Foo.a(); //1 |
function Foo() { |
The text was updated successfully, but these errors were encountered: