js是一种动态语言,即js的对象创建好之后可以随意修改,因此JS对象的面向对象编程部分更可以说是通过JS的怪异特性来模拟Java这类的面向对象编程的。下面首先讨论几种创建对象的方式:

1. 工厂模式创建
       工厂模式,顾名思义就是通过一个函数来创建对象,因为对象的的成员是可以随便修改的,所以在工厂中创建一个Object对象,然后逐次添加自己需要的属性或方法,然后返回这个对象即可,示例如下:
function createStudentInstance(name, age)
{
var stu = new Object();
stu.name = name;
stu.age = age;
stu.goShool = function(){
alert("go to school");
}
}
使用时通过:var student = createStudentInstance("aa", 20),这样的语句即可。
2. 通过构造函数创建对象
        在js中函数中默认包含一个this指针,但该指针的指向却因调用上下文而不同,当将方法当做普通方法调用时,this指向当前window对象,即当前作用域是全局作用域。而使用new运算符调用的话,当前作用域则为new创建的对象,即this指向当前对象。根据这js的特性就可以模拟构造函数的方式来创建对象。示例如下:
function Student(name, age)
{
this.name = name;
tihs.age = age;
this.goSchool = function() { alert("go to school"); }
}
使用时通过:var stu = new Student("aa", 20),这样的语句即可。
3. 通过原型模式创建对象
        首先介绍原型模式,在面向对象编程中同一类继承链的对象都是有共性的,而某些共有的属性的值也是要求一样的,因此创建对象是可以定义一个原型,而需要的时候直接拷贝这个原型即可。
        在JS中函数都是Function类型的实例,也是一种对象类型,而函数对象中含有prototype属性,而该属性是用做实现原型模式的,即通过给prototype赋予属性和方法,这样当创建一个对象后,对象调用属性或方法时,js会逆着原型链来查找对应的属性和方法,因此如果在对象中定义了一个和原型中同名的属性或方法时就会屏蔽原型中的属性和方法。所以原型中的属性和方法也就类似于Java中的类方法和类属性,只是js中的实例属性/方法会屏蔽原型中的属性/方法。示例代码如下:
function student(){
} student.prototype.goschool = function() { alert("go to school"); };var stu1 = new student();
student.prototype.name = "aa";
student.prototype.age = 20;
var stu2 = new student();
stu1.name = "bb";
alert(stu1.name); //bb
alert(stu2.name); //aa
4. 组合构造函数和原型
通过构造函数创建对象会给每个对象都定义同样的成员方法,即每个对象都有一套成员方法,这样就会造成对象间方法的不匹配;而但是用原型创建,则会导致所有对象公用同样的成员变量。所以好的方式是综合使用构造函数和原型,在构造函数中定义成员变量,在原型中定义方法。示例代码如下:
function Student(name, age)
{
this.name = name;
tihs.age = age;
}
student.prototype.goschool = function() { alert("go to school"); };
 

Javascirpt中创建对象的几种方式的更多相关文章

  1. Java中创建对象的几种方式

    Java中创建对象的五种方式: 作为java开发者,我们每天创建很多对象,但是我们通常使用依赖注入的方式管理系统,比如:Spring去创建对象,然而这里有很多创建对象的方法:使用New关键字.使用Cl ...

  2. Java中创建对象的五种方式

    我们总是讨论没有对象就去new一个对象,创建对象的方式在我这里变成了根深蒂固的new方式创建,但是其实创建对象的方式还是有很多种的,不单单有new方式创建对象,还有使用反射机制创建对象,使用clone ...

  3. 【转】Java中创建对象的5种方式

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

  4. JavaScript中创建对象的三种方式!

    JavaScript中创建对象的三种方式! 第一种 利用对象字面量! // 创建对象的三种方式! // 1 对象字面量. var obj = { // 对象的属性和方法! name: 'lvhang' ...

  5. Java中创建对象的5种方式

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

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

    创建对象指创建一个object并给这个对象添加属性和方法,有以下几个方式: 最基本的: var Person={}; Person.name='tom'; Person.age='20'; Perso ...

  7. Java中创建对象的5种方式 &&new关键字和newInstance()方法的区别

    转载:http://www.kuqin.com/shuoit/20160719/352659.html 用最简单的描述来区分new关键字和newInstance()方法的区别:newInstance: ...

  8. Java技术——Java中创建对象的5种方式

    此文为译文 原文连接:https://dzone.com/articles/5-different-ways-to-create-objects-in-java-with-ex 0. 前言 作为Jav ...

  9. Java 中创建对象的 5 种方式!

    Java中有5种创建对象的方式,下面给出它们的例子还有它们的字节码 Employee类: class Employee implements Cloneable, Serializable { pri ...

随机推荐

  1. C#的选择语句练习1

    1.请输入一个数x,若x<1,则y=x:若1<=x<10,则y=2x-1:若x>=10,则y=3x-11,要求随意输入一个x值,求出y值. 2.输入问题[你有房子吗?],若回答 ...

  2. jstl 标签库的使用

    JSTL 核心标签库 使用   JSTL 核心标签库标签共有13个,功能上分为4类: 1.表达式控制标签:out.set.remove.catch 2.流程控制标签:if.choose.when.ot ...

  3. UIPickerView控件中自定义展示的字体大小及样式

    - (UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger) ...

  4. alpha 发布评论

    1.飞天小女警:礼物挑选小工具. 这一组的项目是个人最为感兴趣的,核心功能的实现比较有实际意义,希望所能挑选的礼物范围尽量足够大,界面期待完善后的效果. 2.nice!:约跑app.这一款面向喜爱运动 ...

  5. cx_oracle 执行cur.execute(sql)提交数据出现 UnicodeEncodeError: 'ascii' codec can't encode character u'\u2122' in position 170

    还是中文字符的问题, 解决方法见链接:http://www.oracle.com/technetwork/articles/tuininga-cx-oracle-084866.html import ...

  6. c#大数加法

    在C#中,我们经常需要表示整数.但是,c#的基本数据类型中,最大的long也只能表示-9,223,372,036,854,775,808 到 9,223,372,036,854,775,807之间的数 ...

  7. EF6 连接Oracle 迁移数据错误解决方法

    环境:vs2015 + EF6 +ODP 数据库Oracle 11G add-migratioin 正常,但在update-database 时报如下错误: System.Runtime.Serial ...

  8. clang编译器简介

    本文部分内容引用: 中文维基百科. 结构化编译器前端--clang介绍. 什么是clang编译器? clang是LLVM编译器工具集的一个用于编译C.C++.Objective-C的前端.LLVM项目 ...

  9. [THINKING IN JAVA]操作符

    3 操作符 3.1 static import 可以static import静态方法和变量,这样就可以在不写类名的前提下调用类中的静态方法和变量: package com.chenlei.study ...

  10. Hadoop Pipeline详解[摘抄]

    最近使用公司内部的一个框架写map  reduce发现没有封装hadoop streaming这些东西,查了下pipeline相关的东西 Hadoop Pipeline详解 20. Aug / had ...