【原创整理,基于JavaScript的创建对象方式的集锦】

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

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

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

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

http://www.typescriptlang.org

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

基于 new 的方式创建

 1 var Greeter = (function () {
 2     function Greeter(message) {
 3         this.greeting = message;
 4     }
 5     Greeter.prototype.greet = function () {
 6         return "Hello, " + this.greeting;
 7     };
 8     return Greeter;
 9 }());
10 var greeter = new Greeter("world");
11 var button = document.createElement(‘button‘);
12 button.textContent = "Say Hello";
13 button.onclick = function () {
14     alert(greeter.greet());
15 };
16 document.body.appendChild(button);

或者

 1 function UserModel() {
 2     this.username = ‘‘;
 3     this.pwd = ‘‘;
 4     return this;
 5 }
 6 var model = new UserModel();
 7 model.username = ‘AAAAAAAA‘;
 8 var button = document.createElement(‘button‘);
 9 button.textContent = "Say Hello";
10 button.onclick = function () {
11     alert(model.username);
12 };
13 document.body.appendChild(button);

2. 基于工厂的方式:

 1 function CreateUserModel(user, pwd) {
 2     var obj = new Object(); //或者 var obj={};
 3     obj.user = user;
 4     obj.pwd = pwd;
 5     obj.getNewInstance = function () {
 6         return CreateUserModel(‘‘, ‘‘);
 7     };
 8     return obj;
 9 }
10 var model = CreateUserModel(‘a‘, ‘bb‘);
11 var button = document.createElement(‘button‘);
12 button.textContent = "Say Hello";
13 button.onclick = function () {
14     alert(model.pwd);
15 };
16 document.body.appendChild(button);

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

 1 function UserModel() {
 2 }
 3 UserModel.prototype.username = ‘aaaaaaaa‘;
 4 UserModel.prototype.pwd = ‘gggggggggggg‘;

 5 var model = new UserModel();
 6 model.username = ‘AAAAAAAA‘;
 7 var button = document.createElement(‘button‘);
 8 button.textContent = "Say Hello";
 9 button.onclick = function () {
10     alert(model.username);
11 };
12 document.body.appendChild(button);

4.基于Json的方式

 1 var UserModel={
 2     username:‘‘,
 3     pwd:‘‘,
 4     chids:[],
 5     id:0,
 6
 7     createNew:function(){
 8         var obj={};
 9         //foreach 遍历普通属性
10         for(var p in UserModel){
11             if ( typeof(UserModel[p])!= "function" ){
12                 var pname=p;
13                 obj[pname]=UserModel[p];
14               }
15
16
17         }
18     }
19 };
20
21
22
23 var model= UserModel;
24 model.username=‘BBBBBBBB‘
25 var button = document.createElement(‘button‘);
26 button.textContent = "Say Hello";
27 button.onclick = function () {
28    alert(model.id);
29  };
30
31 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"

时间: 2024-10-29 19:09:04

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

JavaScript总结--创建对象

      在JavaScript中创建对象主要就是用以下三种语句: var box=new Object(); 或var box=Object(); var box={};//字面量 function Box(){}://构造函数       现在,我们就牛刀小试,来创建一个对象 var man=new Object();//创建Object对象的实例:man man.name='Mr.Q';//man对象的name属性 man.sex=30;//man对象的name man.work=fun

一款基于javascript的3D玻璃破碎特效

之前为大家介绍了一款 html5 canvas实现图片玻璃碎片特效.今天要给大家带来一款基于javascript的3D玻璃破碎特效.效果图如下: 在线预览   源码下载 html代码: <div id="container"> <div id="fragment"> </div> </div> css代码: body { background-color: #f1f1f1; margin: 0; overflow: h

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

在上一篇<构建基于Javascript的移动CMS--Hello,World>讲述了墨颀 CMS的大概组成,并进行了一个简单的演示样例,即Hello,World.这一次,我们将把CMS简单的放到一个能够执行的服务器环境中,也就是说我们须要一个简单的执行环境,以便于进行更有意思的东西--加入?模板. 開始之前 环境准备 类Unix系统 由于电脑上已经装有python了,这里便用python起一个简单的server,对于GNU/Linux.Mac OS等类unix系统来说,都能够这样执行: pyt

浅谈基于JavaScript的DDOS攻击

CloudFlare通过对上百万个网站进行防护,总结出最古老.最普遍的攻击非DDoS攻击莫属.在传统的DDoS攻击中,攻击者会控制大量的傀儡机,然后向目标服务器发送大量请求,阻止合法用户访问网站. 然而,最近几年DDoS攻击技术不断推陈出新:攻击者用一种新型且很有趣的方式欺骗用户参与到攻击活动中.去年CloudFlare就见证了一次使用NTP映射的攻击,可能是DDoS攻击史上最大的一次攻击(大于400Gbps). 今年的DDoS攻击又出现了一个新的攻击趋势:使用恶意的JavaScript欺骗用户

7 款基于 JavaScript/AJAX 的文件上传插件

本文整理了7款基于JavaScript和AJAX的文件上传插件,这些插件基本上都能实现以下功能: 多文件上传 拖拽操作 实时上传进度 自定义上传限制 希望能为你的开发工作带来帮助. 1.  jQuery File Upload 具有多文件上传.拖拽.进度条和图像预览功能的文件上传插件,支持跨域.分块.暂停恢复和客户端图像缩放.可与任何服务端平台(如PHP.Python.Ruby on Rails.Java.Node.js.Go等)一起使用,支持标准的HTML表单文件上传. 2.  Pixelco

基于JavaScript的DDoS的攻防介绍

预备知识 随着Web技术的发展,JavaScript作为一种注重交互性的客户端运行脚本,在网站开发过程中使用的越来越普遍.JavaScript是一种基于对象和事件驱动,并具有安全性的脚本语言.它与HTML,CSS结合起来,用于增强功能,并提高与最终用于之间的交互性能.JavaScript代码是解释型的,不需要编译,而是作为HTML文件的一部分由解释器解释执行.目前,基本上所有的浏览器都内置JavaScript的解释器. 分布式拒绝服务攻击(DDoS)始终是网络安全领域一项经久不衰的话题.发动DD

构建基于Javascript的移动CMS——生成博客(二).路由

在有了上部分的基础之后,我们就可以生成一个博客的内容--BlogPosts Detail.这样就完成了我们这个移动CMS的几乎主要的功能了,有了上节想必对于我们来说要获取一个文章已经不是一件难的事情了. 获取每篇博客 于是我们照猫画虎地写了一个BlogDetail.js define([ 'jquery', 'underscore', 'mustache', 'text!/blog_details.html' ],function($, _, Mustache, blogDetailsTempl

构建基于Javascript的移动web CMS——Hello,World

在一篇构建基于Javascript的移动web CMS入门--简介中简单的介绍了关于墨颀CMS的一些原理,其极框架组成,于是开始接着应该说明一下这个CMS是如何一步步搭建起来. RequireJS 使用 库及依赖 这里用的是bower的JS来下载库,详细可以参考一下bower install js使用bower管理js 这篇文章. 需要下载的库有 RequireJS Backbone Underscore Mustache jQuery 使用RequireJS 引用官网的示例 <!DOCTYPE

CodeMirror:基于JavaScript的代码编辑器

官方网站定义: http://codemirror.net/ CodeMirror is a versatile text editor implemented in JavaScript for the browser. It is specialized for editing code, and comes with a number of language modes and addons that implement more advanced editing functionalit