以下4种方式,是我在项目中最常见的JavaScript的面向对象的方式的开发。

测试一般在微软的工具:http://www.typescriptlang.org/Playground

进行测试,或者使用Firefox+FireBug 或者 WebStorm

。。。。。。。说了一大堆废话,我现在还是倾向使用typescript进行一般常规项目的开发了。。。。。。。。。。。。。。。。。。。

http://www.typescriptlang.org

1. (我在项目中最常用的)

基于 new 的方式创建

 var Greeter = (function () {
function Greeter(message) {
this.greeting = message;
}
Greeter.prototype.greet = function () {
return "Hello, " + this.greeting;
};
return Greeter;
}());
var greeter = new Greeter("world");
var button = document.createElement('button');
button.textContent = "Say Hello";
button.onclick = function () {
alert(greeter.greet());
};
document.body.appendChild(button);

或者

 function UserModel() {
this.username = '';
this.pwd = '';
//return this;
}
var model = new UserModel();
model.username = 'AAAAAAAA';
var button = document.createElement('button');
button.textContent = "Say Hello";
button.onclick = function () {
alert(model.username);
};
document.body.appendChild(button);

2. 基于工厂的方式:

 function CreateUserModel(user, pwd) {
var obj = new Object(); //或者 var obj={};
obj.user = user;
obj.pwd = pwd;
obj.getNewInstance = function () {
return CreateUserModel('', '');
};
return obj;
}
var model = CreateUserModel('a', 'bb');
var button = document.createElement('button');
button.textContent = "Say Hello";
button.onclick = function () {
alert(model.pwd);
};
document.body.appendChild(button);

3.基于动态注册属性的方式

 function UserModel() {
}
UserModel.prototype.username = 'aaaaaaaa';
UserModel.prototype.pwd = 'gggggggggggg'; var model = new UserModel();
model.username = 'AAAAAAAA';
var button = document.createElement('button');
button.textContent = "Say Hello";
button.onclick = function () {
alert(model.username);
};
document.body.appendChild(button);

4.基于Json的方式

 var UserModel={
username:'',
pwd:'',
chids:[],
id:0, createNew:function(){
var obj={};
//foreach 遍历普通属性
for(var p in UserModel){
if ( typeof(UserModel[p])!= "function" ){
var pname=p;
obj[pname]=UserModel[p];
} }
}
}; var model= UserModel;
model.username='BBBBBBBB'
var button = document.createElement('button');
button.textContent = "Say Hello";
button.onclick = function () {
alert(model.id);
}; document.body.appendChild(button);

javascript的强大两个关键词:this  new

简单的说,js里面 所有的数据类型 都是Object派生的。Function类型也不例外。当调用一个funtion的时候,this 指向当前的funtion对象。

new 按照javascript语言精粹中所说,如果在一个函数前面带上new来调用该函数,那么将创建一个隐藏连接到该函数的prototype成员的新对象,同时this将被绑定到那个新对象上。

参考:http://www.cnblogs.com/RitaRichard/archive/2011/10/12/2208902.html

JS 中 new 操作符

按照javascript语言精粹中所说,如果在一个函数前面带上new来调用该函数,那么将创建一个隐藏连接到该函数的prototype成员的新对象,同时this将被绑定到那个新对象上。这个话很抽象,我想用实例来让自己加深理解。

1.如果就一个函数,没有返回值,没有prototype成员,然后使用new,会是什么结果呢?如果一个函数没有返回值,那么如果不使用new来创建变量,那么该变量的值为undefined.如果用了new,那么就是Object.说明一个函数的默认的Prototype是Object.

function Test1(str) {     this.a = str; } var myTest = new Test1("test1"); alert(myTest); //[object Object] function Test1WithoutNew(str) {     this.a = str; } var myTestWithoutNew = Test1WithoutNew("test1"); alert(myTestWithoutNew); //undefined;

2.如果函数有返回值,但是返回值是基本类型。那么new出来的myTest还是object.因为基本类型的prototype还是Object. 而如果不使用new,那么返回值就是string的值。

function Test1(str) {     this.a = str;     return this.a; } var myTest = new Test1("test1"); alert(myTest); //Object  function Test1WithoutNew(str) {     this.a = str;     return this.a; } var myTestWithoutNew = Test1WithoutNew("test1"); alert(myTestWithoutNew); //"test1"

3。如果函数的返回值为new出来的对象,那么myTest的值根据new出来的对象的prototype而定。

function Test1(str) {     this.a = str;     return new String(this.a); } var myTest = new Test1("test1"); alert(myTest); //String "test1"

4。接下来我们开始讨论new中的this。如果我们给Test1的prototype中加入一个方法叫get_string(),那么get_string()中的this指的就是这个新对象。能够得到在new时候赋予该对象的属性值。

var Test2 = function(str) {     this.a = str; }
Test2.prototype.get_string = function () { return this.a; };
var myTest2 = new Test2("test2"); alert(myTest2.get_string()); //“test2” var Test2 = function(str) { this.a = str; }
Test2.prototype.get_string = function () { return this.a; };
var myTest2 = Test2("test2"); alert(myTest2)//undefined

5。如果我们修改了函数的prototype,又会发生什么样的情况呢? 那么就会发生类似继承的功能,其实就是js的伪类实现。

function Test1(str) {     this.b = str; } Test1.prototype.Get_Test1String = function () {     return this.b; };
var Test2 = function(str) { this.a = str; } Test2.prototype = new Test1("test1"); Test2.prototype.get_string = function () { return this.a; };
var myTest2 = new Test2("test2"); alert(myTest2); //Object alert(myTest2.get_string()); //"test2" alert(myTest2.Get_Test1String()); //"test1"

【原创整理,基于JavaScript的创建对象方式的集锦】的更多相关文章

  1. javascript中创建对象的方式总结

    javascript中创建对象的方式总结 具体代码如下: //创建对象的方式: //创建方式一 var person=new Object(); person.name='jack'; person. ...

  2. Spring:基于配置文件的创建对象的各种方式

    在Spring3.0之前,Spring主要创建对象的方法是基于配置文件的,即在配置文件中为对象进行注册,并且可以在配置文件当中为对象的字段或者称之为属性值进行赋值,接下来首先介绍基于配置文件的创建对象 ...

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

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

  4. 运维开发笔记整理-基于类的视图(CBV)

    运维开发笔记整理-基于类的视图(CBV) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.FBV与CBV 1>.什么是FBV FBC(function base views ...

  5. 深入理解JavaScript中创建对象模式的演变(原型)

    深入理解JavaScript中创建对象模式的演变(原型) 创建对象的模式多种多样,但是各种模式又有怎样的利弊呢?有没有一种最为完美的模式呢?下面我将就以下几个方面来分析创建对象的几种模式: Objec ...

  6. Spring中Bean的配置:基于XML文件的方式

    Bean的配置一共有两种方式:一种是基于XML文件的方式,另一种是基于注解的方式.本文主要介绍基于XML文件的方式 <bean id="helloWorld" class=& ...

  7. 构建基于Javascript的移动web CMS——模板

    在上一篇<构建基于Javascript的移动CMS--Hello,World>讲述了墨颀 CMS的大概组成,并进行了一个简单的演示样例,即Hello,World.这一次,我们将把CMS简单 ...

  8. JavaScript之创建对象

    不定义JQuery插件,不要说会JQuery 一:导言 有些WEB开发者,会引用一个JQuery类库,然后在网页上写一写$("#"),$("."),写了几年就对 ...

  9. javaScript【创建对象、创建类、成员变量、方法、公有和私有、静态】

    创建对象 方式① 直接使用new Object() var obj = new Object(); 方式② 使用空的{}大括号 var obj2 = {}; 测试 增加属性,访问属性 我们要为创建的对 ...

随机推荐

  1. Roman numerals

    Roman numerals 罗马数字的题目, 注意几个关键的数字即可: (100, 400, 500, 900) -> ('C', 'CD', 'D', 'CM'); (10, 40, 50, ...

  2. back_insert_iterator和iterator用起来不一样。

    先看代码: #include<iostream> #include<vector> #include<algorithm> #include<iterator ...

  3. POJ 2392 Space Elevator DP

    该题与POJ 1742的思路基本一致:http://www.cnblogs.com/sevenun/p/5442279.html(多重背包) 题意:给你n个电梯,第i个电梯高h[i],数量有c[i]个 ...

  4. mysqldump命令详解(转载)

    1.简介 mysqldump为MySQL逻辑备份工具,产生一系列SQL语句,之后重新执行以产生备份的库.表及数据.也可产生CSV.XML等格式的数据.适用于各类引擎的表. 运行mysqldump需一定 ...

  5. pip安装lxml报错

    报错信息![](6a9f8494-8771-49c6-a663-cdcb2bdea123_files/0f4e7b93-9725-4c02-97a8-298d395b6169.png) 解决方法:`` ...

  6. 关系型数据库遵循ACID规则

    事务在英文中是transaction,和现实世界中的交易很类似,它有如下四个特性: 1.A (Atomicity) 原子性原子性很容易理解,也就是说事务里的所有操作要么全部做完,要么都不做,事务成功的 ...

  7. 机器设备(dfs)

    机器设备 时间限制:1000 ms  |  内存限制:65535 KB 难度:2   描述 Alpha 公司设计出一种节能的机器设备.它的内部结构是由 N 个齿轮组成.整个机器设备有 一个驱动齿轮,当 ...

  8. hdu1016Prime Ring Problem

     就是说,给你一个数n, 要你把1到n都连在一起成环. 每一个数不可反复, 且相连的两个数的和要是素数. 把全部情况输出来. 我是用dfs暴力出来的. 首先把素数打表, 然后每次顺时针预測下一个数 ...

  9. IOS基于新浪微博开放平台微博APP

    1.基于新浪微博开放平台APP源码 2.gitHub源代码下载地址 https://github.com/whzhaochao/SinaWeiBoOpen 3.用到的第三放开源库 3.1  RTLab ...

  10. 在Docker中运行torch版的neural style

    相关的代码都在Github上,请参见我的Github,https://github.com/lijingpeng/deep-learning-notes 敬请多多关注哈~~~ 在Docker中运行to ...