《Javascript高级程序设计》学习记录(三)

JS创建对象的几种方式
(一)工厂模式
  所谓的工厂方式就是构造一个普通的函数,在函数里面构建一个包含所有信息的对象并且返回,然后在创建对象的时候使用该函数并且传入相对应的参数即可
  示例代码:
    function createObject(name ,age,job){
            var o = new Object();
            o.name = name;
            o.age = age;
            o.job = job;
            o.sayname = function(){
                alert(this.name);
            };
            return o;
        }
         var person1 = createObject(‘sunshine‘,24,‘engineer‘);
         var person2 = createObject(‘yuanfang‘,21,‘student‘);
         console.log(person1);
         console.log(person2);

(二)构造函数模式

这种模式相对于有过c++基础的童鞋来说是非常简单易懂的,并且通过new来进行创建,调用这种方式创建的时候会经历下面四个步骤:
(1)创建一个新对象
(2)将构造函数的作用域赋给新对象,也就是this指针的指向
(3)执行构造函数中的代码
(4)返回新对象
这个new关键字是必须,如果不加,clock就不会当成构造函数调用,而只是一个普通的函数
示例代码:
  function CreateObject(name,age,job){
             this.name = name;
             this.age = age;
             this.job = job;
             this.sayname = function(){
              alert(this.name);
             };
       }
       var person1 = new CreateObject("yuangang",23,‘engineer‘);
       var person2 = new CreateObject(‘sunshine‘,45,‘student‘);
      alert(person1.constructor == person2.constructor);

(三)原型模式
每一个函数都有一个prototype属性,这个属性是一个指向一个对象的指针,它可以让所有对象共享它所包含的属性和方法,每一个构造函数都有一个原型对象,原型对象在默认的时候有一个属性constructor,指向构造函数,而每一个对象都有一个指向原型对象的内部指针
示例代码:
  function Person(){}

Person.prototype.name = "sunshine";
      Person.prototype.age = ‘23‘;
      Person.prototype.job = ‘engineer‘;
      Person.prototype.sayname = function(){
            alert(this.name);
      };

var person1 = new Person();
      person1.sayname();

var person2 = new Person();
      person2.sayname();

alert(person1.sayname == person2.sayname);

(四)组合使用构造函数模式和原型模式
说白了就是实例属性都在构造函数中定义,而由所有实例共享的属性constructor和方法都在原型中定义。
示例代码:
function Person(name ,age,job){
            this.name = name;
            this.age = age;
            this.job = job;
            this.friends = [‘shelby‘,‘court‘];
      }

Person.prototype = {
           constructor : Person,
           sayname:function(){
               alert(this.name);
           }
      }

var person1 = new Person(‘yuanfang‘,23,‘student‘);
      var person2 = new Person(‘sunshine‘,34,‘engineer‘);
      person1.friends.push(‘sunshine‘);
      alert(person1.friends);
      alert(person2.friends);
      alert(person1.friends === person2.friends);
(五)动态原型模式
是原型模式的一种特例:
function Person(name,age,job){
           this.name = name;
           this.age = age;
           this.job = job;
           if(typeof(this.sayname) != ‘function‘){
               Person.prototype.sayname = function(){
                   alert(this.name);
               };
           }
      }
(六)寄生构造函数模式
  除了使用new操作符并把使用的包装函数叫做构造函数之外,这个魔术和工厂模式没有什么区别
    function Person(name ,age, job){
           var o = new Object();
           o.name = name;
           o.age = age;
           o.job = job;
           o.sayname = function(){
             alert(this.name);
           };
           return o;
      }

var person1  = new Person(‘yuanfang‘,23,‘student‘);
      person1.sayname();
  (七)稳妥构造函数模式
  这个就和c++中的在构造函数中创建一个函数来访问类中的私有变量的功能是一样一样的,这里不贴代码实例了

感觉好高深啊,借此只是希望自己能够透彻理解吧,fighting

时间: 2024-10-28 21:52:18

《Javascript高级程序设计》学习记录(三)的相关文章

JavaScript高级程序设计(第三版)学习,第一次总结

Array类型 var arr = []; arr.length; //返回数组元素个数 改变length可以动态改变数组大小 检测数组 instanceof可以检测某个对象是否是数组,限制:只能是一个网页或一个全局作用域 Array.isArray(arr); //最终确定某个值到底是不是数组,没有限制 转换方法 arr.toString(); //返回由数组每个值的字符串形式拼接而成的以逗号分隔的字符串 arr.valueOf(); //与toString方法一致 arr.toLocalSt

JavaScript高级程序设计学习笔记--基本概念

1.语句 ECMAScript中的语句以一个分号结尾:如果省略分号,则由解析器确定语句的结尾,如下例所示: var sum=a+b //即使没有分号也是有效的语句--推荐 var diff=a-b; //有效的语句--推荐 虽然语句结尾的分号不是必需的,但我们建议任何时候都不要省略它.两个原因:1.加上分号可以避免很多错误 2.加上分号也会在某些情况下增进代码的性能,因为这样解析器就不必再花时间 推测应该在哪里插入分号了. 2.变量 var message="hi"; 像这样初始化变量

JavaScript高级程序设计学习笔记--错误处理与调试

try-catch语句 只要代码中包含finally子句,则无论try或catch语句块中包含什么代码--甚至return语句,都不会阻止finally子句的执行,来看下面这个函数: function testFinally(){ try{ return 2; }catch(error){ return 1; }finally{ return 0; } } 调用这个函数会返回0(PS:但我实际执行的时候会先返回0,再返回2) 抛出错误 与try-catch语句相配的还有一个throw操作符,用于

JavaScript高级程序设计学习笔记--面向对象程序设计

工厂模式 虽然Object构造函数或对象字面量都可以用来创建单个对象,但这些方式有个明显的缺点:使用同一个接口创建很多对象,会产生大量的重复代码.为解决这个问题,人们开始使用 工厂模式的一种变体. function createPerson(name,age,job){ var o=new Object(); o.name=name; o.age=age; o.job=job; o.sayName=function(){ alert(this.name); }; return o; } var

JavaScript高级程序设计学习笔记--引用类型

Object类型 对象字面量表示法: var person={ name:"Nicholas", age:29, 5:true }; 这人例子会创建一个对象,包含三个属性:name,age和5.但这里的数值属性名会自动转换为字符串. 对象属性的访问:点表示法和方括号语法 alert(person["name"]); // "Nicholas" alert(person.name); // "Nicholas" 从功能上看,这两

赠书《JavaScript高级程序设计(第三版)》5本

本站微博上正在送书<JavaScript高级程序设计>走过路过的不要错过,参与方式,关注本站及简寻网+转发微博:http://weibo.com/1748018491/DoCtp6B8r 本站联合简寻网#寻找千里码# 正在送书<javascript高级程序设计>第三版 5本,对这本书期待的朋友可以去参与哦. 关于简寻网: 我们是一群年轻的创业者,我们关注互联网发展,追逐技术的进步.互联网时代的到来,我们希望能通过技术的手段解决生活中的问题.招聘行业是一个传统而又新兴的行业,传统的流

《JAVASCRIPT高级程序设计》第三章

<JAVASCRIPT高级程序设计>第三章主要讲述了这门语言的基础概念,内容多而浅,通过思维导图可以帮助我们很好的理清脉络. js函数使用function关键字来声明,以下是一个简单的例子: 1 function sayHi(name, message){ 2 alert("hello," +name + message); 3 } 函数中可以使用return语句指定返回值,如果只有“return;”,则函数在停止执行后,将返回undefined; 定义的函数有2个参数,那

Javascript高级程序设计学习笔记

3. 基本概念 基本数据类型:Undefined,Null,Boolean,Number,String. 复杂数据类型:Object. 3.6 语句 switch比较值时用的是全等运算符 “===” ,因此不会进行类型转换.例如 “10” 不等于10. 3.7 函数 ECMAScript函数不介意传递进来多少个参数,也不在乎参数的类型.即使定义的函数只接受两个参数,在调用的时候也可以传递任意多个或者0个.因为ECMAScript的参数在内部是用一个数组表示的,在函数体内部可以通过argument

JavaScript高级程序设计学习笔记--高级技巧

惰性载入函数 因为浏览器之间行为的差异,多数JavaScript代码包含了大量的if语句,将执行引导到正确的代码中,看看下面来自上一章的createXHR()函数. function createXHR(){ if (typeof XMLHttpRequest != "undefined"){ return new XMLHttpRequest(); } else if (typeof ActiveXObject != "undefined"){ if (typeo

JavaScript高级程序设计学习笔记--DOM

DOM(文档对象模型)是针对HTML和XML文档的一个API(应用程序接口). Document类型 文档的子节点 虽然DOM标准规定Document节点的子节点可以是DocumentType,Element,ProcessingInstruction或Comment,但还有两个内置的访问其子节点的快捷方式.第一个就是documnetElement属性,该属性始终指向HTML页面中的<html>元素.另一个就是通过childNodes列表访问文档元素,但通过documentElement属性则