JavaScript学习笔记(四) 自定义构造函数和构造函数返回值

自定义构造函数(Custom Constructor Functions)

除了对象字面量模式和内置的构造函数,你可以用你自己的构造函数创建对象;
var adam = new Person("Adam");
adam.say(); // "I am Adam"
这种新模式和Java里用Person类创建对象十分相像,语法非常相似,但在JavaScript中没有类这个概念,Person仅仅是一个构造方法
Person构造方法的定义:
var Person = function (name) {
    this.name = name;
    this.say = function () {
        return "I am " + this.name;
    };
};
当你使用new关键字去调用构造方法时,在构造函数中会发生:
1.一个空对象会被创建,并且将this指针指向它,从函数的原型继承(有个指针指向函数的原型对象);
2.属性和方法被添加到this指向的对象;
3.this指向的新创建的对象在函数结束时会被隐式的作为返回值返回(如果没有其他对象被显式的返回);

背后就相当于下面代码一样:
var Person = function(name) {
    // create a new object
    // using the object literal
    // var this = {};
    // add properties and methods
    this.name = name;
    this.say = function() {
        return "I am " + this.name;
    };
    // return this;
};

在这个例子中为了简单起见,say()方法被添加到this,结果就是每当你调用new Person()的时候就会在内存中创建一个新的函数;
这是很明显是没有效率的,浪费资源,因为say()方法从在所有实例中都是不变的;
更好的选择就是将这样的方法添加到Person的原型中;
Person.prototype.say = function() {
    return "I am " + this.name;
};
我们会在以后讨论更多的原型和继承,在这里,只要记住:将需要复用的成员(好比方法)放到原型中就可以了。

我们前面提到过,在构造方法中在背后就像下面一样:
// var this = {};
但这不是我们看到的那么简单,因为空对象并不是真正的空,它会从Person构造函数继承,所以它更像:
// var this = Object.create(Person.prototype);
我们会在以后讨论Object.create()。

构造函数的返回值(Constructor’s Return Values)

当你用new去调用构造函数,构造函数通常会返回一个对象;
默认它会返回this指向的对象,如果你不在构造函数中给this添加任何属性或方法,会返回一个空对象(除了从构造函数的prototype继承的属性);

构造函数会隐式的返回this,即使在函数中没有return语句,但你也可以选择返回其他任何对象;
在这个例子中,一个被that指向的对象被创建和返回:
var Objectmaker = function () {
    // this `name` property will be ignored
    // because the constructor
    // decides to return another object instead
    this.name = "This is it";
    // creating and returning a new object
    var that = {};
    that.name = "And that's that";
    return that;
};
// test
var o = new Objectmaker();
console.log(o.name); // "And that's that"
		
	

正如你看到的,你可以在构造函数中返回任何其他对象,只要它是个对象;
当你尝试去返回非对象的时候(string,boolean)不会引起错误,只会被简单的忽略,替代的返回的是this指向的对象。








你可能感兴趣的:(JavaScript学习笔记(四) 自定义构造函数和构造函数返回值)