<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<script>
function Foo() {
getName = function(){ console.log(1); };
return this;
}
Foo.getName = function() { console.log(2); };
Foo.prototype.getName = function(){ console.log(3); };
var getName = function() { console.log(4); };
function getName(){ console.log(5); };
Foo.getName(); //2
getName(); //4 执行全局对象的getName方法, 函数声明会先于表达式执行,所以全局对象的getName为 console.log(4)
Foo().getName(); //1 Foo函数中将全局对象window上的getName方法修改为console.log(1)了
getName(); //1 相当于执行window.getName()
new Foo.getName(); // 2
new Foo().getName(); //3 new Foo()时执行Foo函数,返回实例对象,由于Foo()本身并没有this.getName()的方法,所以调用原型对象上的方法
// 函数声明会先于函数表达式执行
// sum1(1,2)
// function sum1(a,b){return a+b;}
// sum2(3,4) //报错:Uncaught TypeError: sum2 is not a function at 1.原型和原型链_字节跳动.html:31
// var sum2 = function(a,b) {return a+b;}
</script>
</body>
</html>
将Foo函数做稍微一点改变后,继续打印的结果:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<script>
function Foo() {
// 这里加了一个this
this.getName = function(){ console.log(1); };
return this;
}
Foo.getName = function() { console.log(2); }; // 相当于给Foo函数对象上添加了一个实例属性getName
Foo.prototype.getName = function(){ console.log(3); };
var getName = function() { console.log(4); };
function getName(){ console.log(5); };
Foo.getName(); // 2
getName(); // 4
Foo().getName(); // 1 此时this指向window,相当于修改全局对象上的getName方法为console.log(1)
getName(); // 1 调用全部对象上的getName方法
new Foo.getName(); // 2
new Foo().getName(); // 1 new Foo()返回一个实例对象,此时实例对象上有this.getName方法,所以就直接调用,返回1
</script>
</body>
</html>