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

来源:互联网 发布:gif添加文字软件 编辑:程序博客网 时间:2024/04/30 00:18

自定义构造函数(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;};// testvar o = new Objectmaker();console.log(o.name); // "And that's that"

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








原创粉丝点击