JS:构造函数
定义:
用new关键字来调用的函数,称为构造函数,构造函数首字母一般大写。
理解:
创建对象,并调用函数,new fn,无参;
创建对象,并调用函数,new fn(),带参;
在构造函数中使用return,如果返回的值是一个对象,它会代替新创建的对象实例返回。如果返回的值是一个原始类型,它会被忽略,新创建的实例会被返回。
看例子!
function Person(name, age) { this.name = name; this.age = age; } var p1 = new Person('lili',10); console.log(p1);
打印结果:
Person {name: 'lili', age: 10}
创建带参无参对象及调用函数:
function fn(a) { this.a = a; this.b = 20; return "hello"; } var re = new fn; //构造函数 console.log(re); var re2 = new fn(200); //构造函数 console.log(re2); var re3 = fn(90); //普通函数调用 console.log(re3);
打印结果:
fn {a: undefined, b: 20}
fn {a: 200, b: 20}
hello
理解:
首先定义变量提升;re是创建了一个新对象,并调用了不带参数的函数fn;re2也是创建了一个新对象,并传入参数,隐式操作是var a = 200,并调用函数;re3是函数调用,并传入参数 a = 90。
例:
function fn() { this.name = "karen"; return function fm() { console.log("fm运行了"); this.name = "jack"; } } var f1=new fn(); console.log(f1); console.log(f1.name); //"fm"
理解:f1的结果看fn函数的返回值是不是引用数据,如果是,则返回哪个引用数据,此时是一个fm函数,如果不是一个对象,那么
就返回新创建的对象。
例:
function fn() { this.name = "marry"; var obj = { name: "karen", fm: function () { this.name = "jack" } } return obj; } var f1 = new fn(); console.log(f1.name); //karen var f2 = new((new fn()).fm)(); console.log(f2.name); //jack var f3 = new fn(); var f4 = new(f3.fm)(); console.log(f3.name, f4.name); //karen,jack
理解:
f2:首先new fn()创建一个对象,再调用,返回一个obj对象,再引用成员fm,并创建一个新的对象,再调用name,因此打印jack。
f3和f4是f2拆分的结果,应该能理解。