Javascript是一种基于对象的语言,你遇到的所有东西几乎都是对象。但是,它又不是一种真正的面向对象编程(OOP)语言,因为它的语法中没有Class。(不过,ES6引入了Class这个概念,作为对象的模板。通过class关键字,可以定义类。ES6入门:http://es6.ruanyifeng.com/)。

  但是在项目开发中,经常用到JS面向对象开发,这就需要我们去用JS创建类,从而去实例化一些对象。接下来我们介绍一下在JS中创建类的几种方式:

  1、工厂方式

//通过工厂方式创建对象,先定义一个工厂方法
function createObj(){
var obj = new Object();
obj.name="xxx";
obj.say=function(){
alert("我是xxx");
}
return obj;
}
//调用工厂方法创建对象:
var obj1 = createObj(); //也可以用这种形式
function createObj(){
var obj = {}; //这样生成对象
obj.name="xxx";
obj.say=function(){
alert("我是xxx");
}
return obj;
}
var obj1 = createObj();

  这种方式的问题是每一次通过工厂方法去创建一个对象,这个对象的属性name和方法say都必须重新创建一次,浪费内存。

  2、构造器方式

//创建一个构造器,构造函数首字母大写
function Obj(){
this.name="xxx";
this.say=function(){
alert("我是xxx");
};
}
//利用构造器,通过new关键字生成对象
var obj1=new Obj();

  这是最基本的方式,但是也存在和工厂方式一样的毛病。

  3、原型方式

//用空函数创建一个类
function Obj(){
}
//在类的原型链上添加属性和方法
Obj.prototype.name="xxx";
Obj.prototype.say=function(){
alert("我是xxx");
}
//生成对象
var obj1=new Obj();

  这个方式的缺点是,当有引用属性时,改变一个对象的这个属性也会改变其他对象的这个属性。因为一个引用属性,都是指向的同一个地方。

  4、原型/构造联合方式

//用构造函数定义对象的非函数属性
function Obj(name){
this.name=name;
this.arr=new Array('a','b');
}
//用原型方式定义对象的方法
Obj.prototype.say=function(){
alert("我是xxx");
}
//生成对象
var obj1 = new Obj('xxx');

  这种是目前用的最多的创建类和对象的方式,将方法和属性用不同的方式封装。

  5.动态原型方式

//动态原型方式和原型/构造混合方式的原理相似,唯一的区别就是赋予对象方法的位置
function Person(name, sex) {
this.name = name;
this.sex = sex;
if (typeof this.say != "function") {
Person.prototype.say = function () {
alert(this.name);
}
}
}
var man =new Person ("凯撒", "男");
man.say();//凯撒

  动态原型模式是将所有的信息都封装到构造函数中,构造函数中,只用say不存在的情况下,才会将它添加到原型中。这段代码只有在初次调用时才会执行。

  实例化obj对象有三步:

  1. 创建obj对象:obj=new Object();

  2. 将obj的内部__proto__指向构造他的函数Obj的prototype,同时,obj.constructor===Obj.prototype.constructor,从而使得obj.constructor.prototype指向Obj.prototype(obj.constructor.prototype===A.prototype)。obj.constructor.prototype与的内部_proto_是两码事,实例化对象时用的是_proto_,obj是没有prototype属性的,但是有内部的__proto__,通过__proto__来取得原型链上的原型属性和原型方法。

  3. 将obj作为this去调用构造函数Obj,从而设置成员(即对象属性和对象方法)并初始化。

  当这3步完成,这个obj对象就与构造函数Obj再无联系,这个时候即使构造函数Obj再加任何成员,都不再影响已经实例化的obj对象了。

js构建类的方法的更多相关文章

  1. JS创建类的方法--简单易懂有实例

    版权声明:本文为博主原创文章,转载请注明出处 Javascript是一种基于对象的语言,你遇到的所有东西几乎都是对象.但是,它又不是一种真正的面向对象编程(OOP)语言,因为它的语法中没有Class. ...

  2. js定义类和方法

    js中定义一个类 //定义一个user类 var user = function(){ //类中的属性 var age; //设置age的值 var setAge = function(age){ t ...

  3. js定义类的方法

    ECMAScript6已经支持了class,但之前版本都不支持类,但是可以通过一些方法来模拟类. js中的类,既是重点,也是难点,很多时候都感觉模棱两可. 首先强调一下js中很重要的3个知识点:thi ...

  4. C#字符串数组排序 C#排序算法大全 C#字符串比较方法 一个.NET通用JSON解析/构建类的实现(c#) C#处理Json文件 asp.net使用Jquery+iframe传值问题

    C#字符串数组排序   //排序只带字符的数组,不带数字的 private   string[]   aa   ={ "a ", "c ", "b & ...

  5. 几种常用的JS类定义方法(转)

    // 方法1 对象直接量 var obj1 = { v1 : "", get_v1 : function() { return this.v1; }, set_v1 : funct ...

  6. 几种常用的JS类定义方法

    几种常用的JS类定义方法   // 方法1 对象直接量var obj1 = {    v1 : "",    get_v1 : function() {        return ...

  7. iscroll.js的简单使用方法(总结)

    iscroll.js的简单使用方法(总结) 一.总结 一句话总结:Scroll是一个类,每个需要使用滚动功能的区域均要进行初始化. 最佳的HTML结构如下: <div id="wrap ...

  8. WebView全面学习(一)--常用类和方法

    WebView全面学习(一)--常用类和方法 WebView本质上是一个View,他基于webkit引擎来展示web页面 在Android不同的版本webkit内核有所区别,从Android版本上看, ...

  9. iscroll.js的简单使用方法

    参考链接:https://www.cnblogs.com/Renyi-Fan/tag/js%E6%8F%92%E4%BB%B6/default.html?page=2 目录 一.总结 一句话总结:Sc ...

随机推荐

  1. 修改Eclipse jdk环境

    原因:由于项目原因,要将原有的工程从jdk1.6迁移到jdk1.7 问题:Eclipse默认的jdk环境为jdk1.6 解决方法: 1)首先是安装jdk1.7,以及配置环境变量,在这里就不再说了 2) ...

  2. MySQL 备份数据库

    一.数据备份 1.备份一个数据库 mysqldump基本语法: mysqldump -u username -p dbname table1 table2 ...-> BackupName.sq ...

  3. Python爬虫学习:一些关于爬虫的知识的充电

    什么是Http和Https http协议:全称是HyperText Transfer Protocol,中文意思是超文本传输协议,是一种发布和接收Html页面的方法.默认的端口号是80 https协议 ...

  4. UBUNTU 无法解析域名 解决方法

    莫名其妙的,ubuntu 无法访问外网. ping www.taobao.com  www.baidu.com 提示无效的主机名 但是ping 外网ip 都是可以PING通的. 所以断定是 dns问题 ...

  5. guava学习:guava集合类型-Bimap

    学习guava让我惊喜的第二个接口就是:Bimap BiMap是一种特殊的映射其保持映射,同时确保没有重复的值是存在于该映射和一个值可以安全地用于获取键背面的倒数映射. 最近开发过程中,经常会有这种根 ...

  6. Java reflect 反射 2

    Constructor Constructor表示一个类的构造器.即构造器的反射对象! 它是Class的一个组成部门,所以需要先得到Class,再通过Class的方法得到Constructor 1获取 ...

  7. To B服务想做移动化?腾讯云案例了解一下

    本文由 腾讯云助手团队 发布于 腾讯云云+社区 | 导语:腾讯云那么多资源和服务,就不能手机管理吗? 能. 当用户在使用To B服务时,往往会遇到各种各样的限制: 1.操作难度:涉及各种权限.多重验证 ...

  8. 去掉img标签周围的空白

    我们在页面布局的时候,明明已经去掉了所有标签的margin和padding,img标签周围依然会有空白,解决方法有以下几种: 1.给img标签设浮动: img{ float:left; } 2.将im ...

  9. C C++ OC指针常量和常量指针区别

    看Effective Objective-C 2.0  编写高质量iOS与OS X代码的52个有效方法这本书的时候看到有一个说多用类型常量,少用#define预处理指令 ,在这里面有说到指针常量,之前 ...

  10. String.replace与String.format

    字符串的替换函数replace平常使用的频率非常高,format函数通常用来填补占位符.下面简单总结一下这两个函数的用法. 一.String.replace的两种用法 replace的用法如:repl ...