js中对象与对象创建方法的各种方法(2)

function Person(name, age) { this.name = name; this.age = age; this.sayName = function() { console.log(this.name); } } var person1 = new Person("Nicholas", 29); var person2 = new Person("Greg", 27);

这里要说明一下,构造函数需要以一个大写字母开头,而非构造函数应该以一个小写字母开头,这个主要是为了区别构造函数和其它函数,构造函数其实本身也是函数,只是用来创建对象而已

其中,要创建Person的新实例,需要使用new操作符,其实这里会经过4个步骤,首先,将会创建一个新对象,接着会将构造函数的作用域赋给新对象,this指向了这个对象,接着会执行构造函数中的代码,为这个新对象添加属性,最后会返回新对象

优点:可以创建多个对象,解决对象的识别问题

缺点:每个实例都会创建不同的function实例,而其实创建完成同样任务的function实例是很没有必要的

这里还是要说明一下,对象类型的检测需要用到instanceof操作符,比如像上面的例子可以用下面的方法检测

console.log(person1 instanceof Person); // true console.log(person2 instanceof Person); // true

使用构造函数模式可以解决对象的识别问题,而这也是工厂模式无法办到的

    3、原型模式

我们都知道,每个函数都有一个prototype属性,这个属性是一个指针,指向一个对象,而这个对象就是原型对象,包含了所有实例共享的属性和方法,如果我们要创建的对象需要共享属性和方法,就可以使用这种方法创建

function Person() { } Person.prototype.name = "Nicholas"; Person.prototype.age = 29; Person.prototype.sayName = function() { console.log(this.name); } var person1 = new Person(); var person2 = new Person(); person1.sayName(); // Nicholas person2.sayName(); // Nicholas

优点:不用为构造函数传递参数,可以创建多个相同的对象

缺点:原型中的属性被很多实例共享,当属性为包含引用类型值的属性时,修改一个实例中属性的值,另一个实例中的属性的值也会改变

    4、组合使用构造函数模式和原型模式

通过前面的分析,我们应该可以看到构造函数模式和原型模式的优点和缺点啦,构造函数可以创建多个不同属性值的对象,原型模式可以用于定义方法和共享的属性,我们可以将这两种模式结合起来,这种模式现在是使用最广泛的一种模式啦

function Person(name, age) { this.name = name; this.age = age; } Person.prototype = { constructor: Person, sayName: function() { console.log(this.name); } } var person1 = new Person("Nicholas", 29); var person2 = new Person("Greg", 27); person1.sayName(); // Nicholas person2.sayName(); // Greg person1.sayName === person2.sayName; // true

从上面的例子我们可以看到,使用这种模式创建对象,每个实例都会有自己的一份实例属性的副本,但同时又共享着对方法的引用,最大限度地节省了内存,另外,这种混成模式还支持向构造函数传递参数,可谓是集两种模式之长 

    5、动态原型模式

这种模式主要是将所有信息都封装在了构造函数里,因为在组合构造函数模式和原型模式中,构造函数和原型模式是独立的,有些开发人员会感到很困惑,因此,这种模式也是为了解决这个问题,通过在构造函数中初始化初始化原型,又保持了同时使用构造函数和原型的优点,换句话说,就是可以通过在构造函数中,检查某个应该存在的方法是否有效,来决定是否需要初始化原型

function Person(name, age) { this.name = name; this.age = age; if(typeof this.sayName != "function") { Person.prototype.sayName = function() { console.log(this.name); } } } var person1 = new Person("Nicholas", 29); person1.sayName(); // Nicholas

这里要说明一下,在if语句中的代码,只有在首次调用构造函数时才会执行,之后原型已经得到初始化,不需要再做什么修改了

    6、寄生构造函数模式

这种模式其实和工厂模式很像,除了使用new操作符并把使用的包装函数叫做构造函数之外,和工厂模式可以说是一模一样的,这种模式的基本思想是创建一个函数,该函数的作用仅仅是封装创建对象的代码,然后再返回新创建的对象

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/d8706103fe6ae59e6e76b0695355d4a3.html