1.创建函数的方式
// 1.命名函数 function fun1() { console.log("这是第一种方式"); } // 2.匿名函数 var fun2 = function () { console.log("第二种方式--匿名函数也称为函数表达式"); } // 3.这种方式创建的函数在函数外只能用fun3调用,fun4只能在函数内部使用 var fun3 = function fun4() { console.log("这是第三种方式--命名函数表达式"); } // 4.通过new和Function创建函数--这种方式创建的是匿名函数--可以写函数体 var fn = new Function("a", "a", "b", "return a + a + b;"); var result = fn(1, 2, 3);//7,如果形参相同 调用时传递的实参 后面的实参会把前面的覆盖 ---在这里2把1覆盖了 console.log(result);
2.创建对象的方式
// 1.字面量方式创建 var obj1 = {};//创建一个内容为空的对象 // 2.通过内置构造函数方式创建 ---存在问题:第一和第二种方式会存在大量的代码 var obj2 = new Object(); // 3.工厂模式---将内置构造函数的方式封装 ---存在问题:无法判断创建出来的对象类型 function createPerson(name, age) { var obj3 = new Object(); obj3.name = name; obj3.age = age; return obj3; } var per = new createPerson("lily", 20); console.log(per instanceof createPerson); //false // 4.自定义构造函数方式创建 //存在问题:每次实例化一个对象,都会在内存中开辟一块空间存储数据, //但是存储的方法在每个对象中是相同的,这样的存储方式会增大内存消耗---因此方法一般放在原型对象上共享 function Animal(name, age) { this.name = name; this.age = age; // this.show = function () { //方法一般放在原型对象上 // console.log(this.name, this.age); // } // 默认返回this } var an = new Animal("dahuang", 2); // an.show(); /* 自定义构造函数的创建和封装: 1.在函数内部默认会创建一个 var obj = new Object(); 2.默认把创建好的对象赋值给this this = obj; 3.默认设置this的原型对象为当前构造函数的原型对象; 4.通过this添加属性和方法; 5.默认把内部创建的对象返回 return this; */ // 5.通过Object.create()方式创建 // 可以接收的参数有两种情况: // 1.null 创建一个空对象,这对象连最基本的原型对象都没有 // 2.对象作为参数,将传递进来的参数作为当前对象的原型对象 var obj5 = Object.create(null);//创建一个没有原型对象的对象 console.log(obj5); var obj6 = { name: "aa", code: 101210 }; var obj7 = Object.create(obj6);//将obj6作为obj7的原型对象 console.log(obj7); // 6.通过Object.assign()方式创建 // 将多个对象合并为一个对象,如果合并的时候出现属性相同 后面的属性会覆盖前面的 var obj9 = { name: "zth", age: 25 }; var obj10 = { name: "lyf", address: "****" }; var obj8 = Object.assign(obj9, obj10); //后面的name属性会覆盖前面的name console.log(obj8);