HTML 学习笔记 JavaScript(创建对象)

JavaScript 有Date Array String等这样的内置对象,功能强大实用简单,但在处理一些复杂逻辑的时候,内置对象就很无力了,往往需要开发者自定义对象。

对象是什么

从JavaScript定义上讲对象是无序属性的集合,其属性可以包含基本值,对象或函数。也就是说对象是一组没有特定顺序的属性,每个属性都会映射到一个值上,是一组键值对,值可以是数据或对象。

最简单的对象

JavaScript的一对花括号{}就可以定义为一个对象,这样的写法实际上和调用Object的构造函数一样

var obj = {};
var obj2 = new Object();

这样构建出来的对象仅仅包含一个指向Object的prototype的指针,可以使用一些valueOf、hasQwnProperty等方法,没有多大实际作用,自定义对象嘛总要有一些自定义的属性、方法神马的。

var obj = {};
//添加属性 和 方法
obj.a = 0;
obj.fun = function() {
    alert("我是一个对象");
}

var obj2 = {
    a:0;
    fn:function(){
        alert("我是自定义对象");
    }
}

可以在定义万对象后通过"."为其添加属性和方法,也可以使用字面量赋值方法在定义对象的时候为其添加属性和方法。这样创建的对象,其方法和属性可以直接使用对象引用,类似于类的静态变量和静态函数,这样创建的对象又一个明显的缺陷----在定义大量对象的时候 很费力,要一遍遍的写几乎重复的代码。

抽象一下

既然是重复代码就可以抽象出来,用函数来做这些重复的工作,在创建对象的时候调用一个专门创建对象的方法,对于不同的属性值只需要传入不同的参数就行。

window.onload = function() {
    var obj = createObj(2,function() {
        alert(this.a);
    });
    obj.fn();

}

function createObj(a,fn) {
    var obj = {};
    obj.a = a;
    obj.fn = fn;
    return obj;
}

这样创建大量对象的时候,就可以调用创建对象的方法来做一些工作了,这种方式也不完美,因为在很多时候需要判断对象的类型,上面的代码创建出来的对象都是最原始的Object对象实例,只是拓展了一些属性和方法。

有型一些

又是function出场的时候,JavaScript中function就是个对象,在创建对象的时候可以抛开上面的createObj(),直接使用function作为对象,怎么实现复用呢,这就在于function作为对象的特殊性了。

(1)function可以接受参数,可以根据参数来创建相同类型不同值的对象。

(2)function作为构造函数(通过new操作符调用)的时候会返回一个对象,

构造函数的返回值分为两种情况,当function没有return语句或者return回一个基本类型(bool,int,string,undefined,null)的时候,返回new 创建的一个匿名对象,该对象即为函数实例;如果function体内return一个引用类型对象(Array,Function,Object等)时,该对象会覆盖new创建的匿名对象作为返回值。

3. 那么使用function怎么解决类型识别问题呢,每个function实例对象都会有一个constructor属性(也不是“有”,而是可以对应),这个属性就可以指示其构造是谁,也可以使用instanceof 操作符来做判断对象是否为XXX的实例。

function Person(name) {
    this.name = name;
    this.fun = function() {
        alert(this.name);
    }

}

var person2=new Person(‘Frank‘);
person2.fun();

这样就完美了吧,也不是!虽然构造函数可以是对象有型,但对象的每个实例中的方法都要重复一遍!

function Person(name){
                this.name=name;
                this.fn=function(){
                    alert(this.name);
                }
            }

            var person1=new Person(‘Byron‘);
            var person2=new Person(‘Frank‘);

            console.log(person1.fn==person2.fn);//false

看看看,虽然两个实例的fn一模一样,但是却不是一回事儿,这如果一个function对象有一千个方法,那么它的每个实例都要包含这些方法的copy,很让内存无语啊。

完美方法

究竟有没有一种近乎完美的构造对象的方式,及不用做重复工作,又有型,对象通用方法又不必重复?其实可以发现使用function已经距离要求和接近了,只差那么一点儿——需要一个所有function对象的实例共享的容器,在这个容器内存发实例需要共享的属性和方法,正好这个容器是现成的——prototype,不了解prototype的同学可以看看JavaScript prototype

function Person(name){
                this.name=name;
            }

            Person.prototype.share=[];

            Person.prototype.printName=function(){
                alert(this.name);
            }

            var person1=new Person(‘Byron‘);
            var person2=new Person(‘Frank‘);

            console.log(person1.printName==person2.printName);//true

这样每个Person的实例都有自己的属性name,又有所有实例共享的属性share和方法printName,基本问题都解决了,对于一般的对象处理就可以始终这个有型又有爱的创建对象模式了。

// http://www.cnblogs.com/dolphinX/p/3286177.html

时间: 2024-12-20 17:54:01

HTML 学习笔记 JavaScript(创建对象)的相关文章

学习笔记---Javascript事件Event、IE浏览器下的拖拽效果

学习笔记---Javascript事件Event.IE浏览器下的拖拽效果     1. 关于event常用属性有returnValue(是否允许事件处理继续进行, false为停止继续操作).srcElement(触发事件的事件源对象)和attachEvent("onclick",function(){...}); 2. a. 实现拖放(Drag and Drop): 目前支支持IE, 若定制某对象为可拖放对象, 则必须覆盖目标对象的dragenter和dragover事件, 可以用e

HTML 学习笔记 JavaScript(面向对象)

现在让我们继续跟着大神的脚步前进 学习一下JavaScript中的面向对象的思想,其实作为一个iOS开发者,对面向对象还是比较熟悉的,但是昨晚看了一下Js中的面向对象,妈蛋 一脸萌比啊.还好有大神.让我们跟着大神的思路在捋一下.(在这里更欢迎大家阅读原博 )原博地址:http://www.cnblogs.com/dolphinX/p/4385862.html 理解对象 对象这个词如雷贯耳,同样出名的一句话:XXX语言中一切皆为对象! 对象是什么?什么觉面向对象的编程? 对象(object),台湾

javascript学习笔记3——创建对象

本文主要是对<JavaScript高级程序设计>第六章(面向对象的程序设计)的总结,书上的这章至少看了4遍是有的.该章主要讲对象的创建与继承.其中创建对象和继承方式至少6种,再加上一些方法属性,很容易搞得晕头转向的.因此有必要对本章的内容理一理,以后忘了也好过来看一看. 由于文章长度的限制,本文主要讲创建对象. 1创建对象 1.1 一般方法 使用Object或者采用对象字面量的方法. 1 var o = {a: 1}; 2 var o2=new Object(); 3 o2.a=1; 缺点:使

HTML 学习笔记 JavaScript (prototype)

原博地址:http://www.cnblogs.com/dolphinX/p/3286177.html 原博客的作者是一个非常牛逼的前端大神,我作为一个初学者,在此借助大神的博客进行自己的学习.在这里感谢原作者无私的分享.也强烈建议大家到原作者的博客下学习.好了,现在让我们跟着大神的脚步前进吧. 用过JavaScript的人肯定都对prototype如雷贯耳,但是这究竟是个什么东西却让初学者莫衷一是,只知道函数都有一个prototype属性,可以为其添加函数供实例访问,其他的就不清楚了,下面我们

[学习笔记]JavaScript基础

JavaScript概述 1. JavaScript定义 JavaScript是Netscape公司开发的一种基于对象和事件驱动的脚本语言.它是弱类型语言,只能由浏览器解释执行. 其中: 脚本语言:解释运行(由浏览器来解释执行),无需编译. 基于对象:有一些内置的对象共我们使用,但是不能完全实现继承,封装和多态,只能模拟. 事件驱动:必须由事件触发. 2. JavaScript的发展历程 在1995年时,由网景(Netscape)公司在Netscape浏览器上首次设计实现而成.因为网景公司与升阳

HTML 学习笔记 JavaScript (函数)

函数是由事件驱动的或者当他被调用时执行的可重复使用的代码块 实例 <!DOCTYPE html> <html> <head> <script> function myFunction() { alert("Hello World!"); } </script> </head> <body> <button onclick="myFunction()">点击这里</b

[前端JS学习笔记]JavaScript 数组

一.JavaScript数组的奇葩 大多数语言会要求数组的元素是同个类型, 但是JavaScript允许数组元素为多种类型. var arr = ["羽毛球", 666, {"json:":"666"}]; console.log(arr.length); 二.JavaScript 数组的两种声明 1.var arr = [元素]; var arr = ["坚持"]; 2.new Array(); 或者 var arr2 =

笔记-javascript创建对象

1. 工厂模式创建对象 1 //在函数内创建一个对象,给对象赋予属性及方法再将对象返回 2 function person (name, age) { 3 var obj = new Object(); 4 obj.name = name; 5 obj.age = age; 6 obj.sayName = function () { 7 alert(this.name); 8 }; 9 return obj; 10 } 11 var per = person("zhangsan", 2

学习笔记.JavaScript应用程序(三)

1.函数传值&探测对象 window.onload = initAll; /* function initAll(){     for(i=0;i<24;i++){         var newNum = Math.floor(Math.random()*75) + 1;         document.getElementById("square" + i).innerHTML = newNum;     } } */ function initAll(){