1.工厂方法

demo.js
1
2
3
4
5
6
7
8
9
10
11
function createPerson(name, age) {
var person = new Object();
person.name = name;
person.age = age; person.sayHi = function() {
return "name: " + this.name + " age: " + this.age;
}; return person;
}

优点:创建相同实例只有一处代码。

缺点:不知道对象原型。

test.js
1
2
3
4
5
6
7
8
var person1 = createPerson("zhang", 20);
var person2 = createPerson("li", 30); console.log(person1.sayHi());
console.log(person2.sayHi()); console.log(person1 instanceof Person); //false
console.log(person2 instanceof Person); //false

2.构造函数

demo.js
1
2
3
4
5
6
7
8
function Person(name, age) {
this.name = name;
this.age = age; this.sayHi = function() {
return "name: " + this.name + " age:" + this.age;
};
}

优点:可以知道实例原型。

缺点:方法不是同一个方法实例。

test.js
1
2
3
4
5
6
7
8
9
10
var person1 = new Person("zhang", 20);
var person2 = new Person("li", 30); console.log(person1.sayHi()); //name: zhang age:20
console.log(person2.sayHi()); //name: li age:30 console.log(person1 instanceof Person); //true
console.log(person2 instanceof Person); //true console.log(person1.sayHi == person2.sayHi); //false

3.原型方法

demo.js
1
2
3
4
5
6
7
function Person() {}

Person.prototype.name = "zhang";
Person.prototype.age = 20;
Person.prototype.sayHi = function() {
return "name: " + this.name + " age: " + this.age;
};

优点:共享方法实例对象。

缺点:每个实例需要定义非方法属性。

test.js
1
2
3
4
5
6
7
8
9
10
11
12
13
var person1 = new Person();
var person2 = new Person(); person2.name = "li";
person2.age = 30; console.log(person1.sayHi()); //name: zhang age:20
console.log(person2.sayHi()); //name: li age:30 console.log(person1 instanceof Person); //true
console.log(person2 instanceof Person); //true console.log(person1.sayHi == person2.sayHi); //true

4.构造函数和原型的组合方法

demo.js
1
2
3
4
5
6
7
8
function Person(name, age) {
this.name = name;
this.age = age;
} Person.prototype.sayHi = function() {
return "name: " + this.name + " age: " + this.age;
};

优点:非方法属性在构造函数中定义,方法属性则在原型中定义。

总结:最后一种方法是比较好的创建对象的方式,综合了前面3种方式的优点。每个实例对象都有自己实例属性的一份副本,但同时共享着方法的引用,最大限度节省了内存。

Javascript几种创建对象的方法的更多相关文章

  1. JavaScript 三种创建对象的方法

    JavaScript中对象的创建有以下几种方式: (1)使用内置对象 (2)使用JSON符号 (3)自定义对象构造 一.使用内置对象 JavaScript可用的内置对象可分为两种: 1,JavaScr ...

  2. java四种创建对象的方法

    1.用new语句创建对象,这是最常见的创建对象的方法.   2.运用反射手段,调用java.lang.Class或者java.lang.reflect.Constructor类的newInstance ...

  3. C++中三种创建对象的方法【转】

    我们都知道C++中有三种创建对象的方法,如下: #include <iostream> using namespace std; class A { private: int n; pub ...

  4. 转 java中5种创建对象的方法

    作为Java开发者,我们每天创建很多对象,但我们通常使用依赖管理系统,比如spring去创建对象.然而这里有很多创建对象的方法,我们会在这篇文章中学到. Java中有5种创建对象的方式,下面给出它们的 ...

  5. javascript三种创建对象的方式

    javascript是一种“基于prototype的面向对象语言“,与java有非常大的区别,无法通过类来创建对象.那么,既然是面象对象的,如何来创建对象呢? 一.通过”字面量“方式创建. 方法:将成 ...

  6. js几种创建对象的方式

    javascript是一种“基于prototype的面向对象语言“,与java有非常大的区别,无法通过类来创建对象.那么,既然是面象对象的,如何来创建对象呢? 一.通过”字面量“方式创建. 方法:将成 ...

  7. JavaScript 中创建对象的方法(读书笔记思维导图)

    面向对象(Object-Oriented, OO)的语言有一个标志,那就是它们都有类的概念,而通过类可以创建任意多个具有相同属性和方法的对象.而 ECMAScript 中没有类的概念,所以我们可以使用 ...

  8. JavaScript高级特性-创建对象的九种方式

    1. 对象字面量 通过这种方式创建对象极为简单,将属性名用引号括起来,再将属性名和属性值之间以冒号分隔,各属性名值对之后用逗号隔开,最后一个属性不用逗号隔开,所有的属性名值对用大括号括起来,像这样: ...

  9. javascript创建对象的方法--原型模式

    javascript创建对象的方法--原型模式 一.总结 1.原型模式解决内存浪费的方法(继承):通过继承,对象继承原型模式下的所有属性,对象不同于其它对象的的属性自己创建或者修改 2.原型的使用(p ...

随机推荐

  1. H5上传压缩图片

    看这个,比较全的 https://github.com/mhbseal/html5ImgCompress ,几乎所有痛点都解决了! PC上传图片 基本结构 form[enctype="mul ...

  2. MegaCli 监控raid状态

    MegaCli 监控raid状态 http://blog.chinaunix.net/uid-25135004-id-3139293.html 简介 MegaCli是一款管理维护硬件RAID软件,可以 ...

  3. centos7.3下ScyllaDB1.6安装

    转自:http://10710016.blog.51cto.com/10700016/1900483 ScyllaDB 安装配置 1.说明: scylladb支持centos7.2 64位 及以上版本 ...

  4. /etc/rc.d/rc.local linux启动自动开启某些服务(转)

    /etc/rc.d/rc.local似乎是很多Linux系统管理员的偏爱,因为凡是需要随系统自动启动的服务.程序等,只要系统没有提供Sys V风格的启动脚本,就把这些需求都塞到/etc/rc.d/rc ...

  5. 特定于类的内存管理---《C++必知必会》 条款36

    我们可以量身定制 operator new 和 operator delete 用于某个类类型,而不是必须使用标准版的 operator new 和 operator delete. 注意:我们不可以 ...

  6. A Practical Guide to Support Vector Classi cation

    <A Practical Guide to Support Vector Classication>是一篇libSVM使用入门教程以及一些实用技巧. 1. Basic Kernels: ( ...

  7. 587. Erect the Fence(凸包算法)

    问题 给定一群树的坐标点,画个围栏把所有树围起来(凸包). 至少有一棵树,输入和输出没有顺序. Input: [[1,1],[2,2],[2,0],[2,4],[3,3],[4,2]] Output: ...

  8. laravel 多图上传

    前台  name="photo[]" 后台获取  $request->file('photo');//获取多个图片循环

  9. 20145227鄢曼君《网络对抗》逆向及Bof基础

    20145227鄢曼君<网络对抗>逆向及Bof基础 实践目标 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调用foo函数,foo函数会简单回显任 ...

  10. Two Sum(II和IV)

    本文包含leetcode上的Two Sum(Python实现).Two Sum II - Input array is sorted(Python实现).Two Sum IV - Input is a ...