<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<script>
//任意函数都可以使用new关键字进行调用 通过new使得普通的函数变成了构造函数
//一般情况下构造函数的首字母需要大写
//new关键字做了四件事。
//1-开辟了一块内存空间 创建了一个新对象
//2-让this指向这个空对象
//3-调用构造函数 给对象添加属性和方法
//4-返回这个新对象
//知识点: 在js中构造函数可以有返回值也可以没有
// =========================================================================================
// function A(){
// console.log("A"); //A
// return "aaa";
// }
// var obj1 = new A();
// console.log(obj1); //A{}
//如果返回值是基本数据类型 js会自动忽略这个返回值,也就是跟没有写返回值一样 最终返回的还是新创建的实例对象
// ========================================================================================
// function B(){
// console.log("B"); //B
// return {b:"bbb"};//字面量创建对象 ===(等同于)new Object({b:"bbb"})
// }
// var obj2 = new B();
// console.log(obj2); //{b:"bbb"}
//如果返回值是引用数据类型 则实际返回的就是这个引用数据类型(复杂数据类型),此时函数返回值即return,只跟当前写的数据类型有关,跟新创建的实例对象没有任何关系!
// =======================================================================================
//常规用法
// function C(){
// console.log("C"); //C
// }
// var obj3 = new C();
// console.log(obj3); //C{}
//如果没写return,这个构造函数也有返回值,返回当前创建的新对象,因为new做了这件事
// =======================================================================================
// function D(){
// console.log("D"); //D
// return this;
// }
// var obj4 = new D();
// console.log(obj4); //D{}
//如果函数的返回值是this 那么就跟没有写返回值结果是一样的,因为new是this指向当前创建的新对象,即实例
function obj(x){
console.log("E"); //E
this.x = x;
}
var obj1 = new obj(10);//new做的事情是让当前普通函数转化成构造函数,使this指向当前实例
console.log(obj1);
var obj2 = obj(10);//相当于函数调用,this指向window。window上有键值X :10;
console.log(window);
</script>
</body>
</html>