zoukankan      html  css  js  c++  java
  • 第六章面向对象到程序设计

    6.1

    第5章创建对象  var person a=new object(); person.name="Nicholas";person.age=29;person.job="software engineer";person.sayName=function(){alert(this.name)};//这种发法到缺点是使用同一个接口创建很多对象,产生大量重复代码,为了解决这个问题人们工厂模式的一个变体。

    6.1.1 工厂 模式     (解决了创建多个对象到问题,但是无法解决识别对象到问题<即怎样知道一个对象的类型,因此6.1.2>)

    function cratePerson(name,age,job){

    var o=new object();

    o.name=name;  o.age=age;  o.job=job;  o.sayName=function(){alert(this.name);};

    returen o;

    }

    var person1=createPerson("Nicholas",39,"software engineer");  person1.sayName();

    var person2=createPerson("Grey",29,"Doctor");  person2.sayName()

    6.1.2 构造函数模式

    function Person(name,age,job){//Person构造函数首字母大写,其他非构造函数到函数首小写

    this.name=name;this.age=age;this.job=job;this.sayName=function(){alert(this.name);};

    }//没有显示创建对象;直接将属相和方法赋给this;没有ruturn;

    var person1=new Person("Nicholas",20,"software engineer");person1.sayName();

    var person2=.......;person2.sayName();

    //这两个函数都有个constructor属性,该属性指向Person。例如:alert(person1.constructor==Person);//true  alert(person2.constructor==Person);//true;

    对象constructor属性,最初是用来标示对象类型的,但是,用来检测对象类型,还是instanceof操作根尖可靠,我们在这个例子中创建的对象,即使Object实例,又是Person实例。alert(person1 instanceof object);//true  alert(person1 instanceof Person)//true;

    //构造函数意味着将来可以将它到实例表示为一种特定到类型,这是构造函数模式胜过工厂模式到地方!!

    //构造函数于非构造函数到区别主要是new关键字,其他并无区别,例如:

    var person =new Person("Nicholas",29,"software engineer");

    person.sayName();//Nicholas;

    //作为普通函数

    Person("Nicholas",28,"software engineer");//添加到window

    window.sayName();//Nicholas;

    //在另一个对象到作用域中调用

    var o=new object();

    Person.call(o,"kristen",25,"Nurse");//将Person方法放到o中

    o.sayName();

    2.构造函数到问题

    构造函数模式虽然好,但并非没有缺点,问题就是,每个方法都要在每个实例上创建一遍,person1到syaName()于person2到sayName()是不同到方法,例如:

    alert(person1.sayName==person2.sayName);//false

    也可以将sayNameI 方法,提取到全局 变量中,但是这样每个全局方法,只能用于某个对象,如果一个对象很多全局函数,我们这个自定义的引用类型就毫没有封装可言了。

    6.1.3 原型模型

    我们创建到每个函数都有个prototype(原型)属性,这个属性是一个对象,她的用途是,包含所有特定类型到所有实例共享到属性和方法。使用prototype到好处就是可以让所有对象实例共享他所包含到实例和方法。

    function Person(){}

    Person.prototype.name="Nicholas";

    Person.prototype.age=23;

    Person.prototype.job="software engineer";

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

    var person1=new Person();

    person1.sayName();//Nicholas

    var person2=new Person();

    person2.sayName();//Nicholas

    alert(person1.sayName==person2.sayName);//true   比较两个方法会发现,他们是相等的;

     每个原型模型实例(person1、person2),都有一个_proto_属性这个属性指向 Person到Prototype属性

    可以功过isPrototypeOf()来确定对象之间是否有这种关系,因为每个对象到_proto_指向调用isPrototypeOf方法的对象(Person.Prototype),那么,

    alert(Person.prototype.isPrototypeOf(person1));//true

    alert(Person.prototype.isPrototypeOf(person2));//true

    原型模型,遍历,首先会遍历,在实例调用时,首先遍历,实例有没有该方法,或属相,如没有再去找原想中遍历调用,实例记录了自己到属相方法,调用时没有才去调用原型

    function Person(){}

    Person.name="Nicholas";

    Person.age=32;

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

    var person1=new Person();  //person1.name="Grey";  alert(person1.name);//Grey

    var person2=new Person();  alert(person2.name);  //Nicholas

    delete person1.name;//删除person1自己到name 属性

    alert(person1.name);//Nicholas

    也可用实例的hasOwnProperty()方法检测是否实例是否拥有自己到模个属性。

    person1.name="Grey";

    alert(person1.hasOwnProperty("name"));//true

    delete person1.name;

    alert(person1.hasOwnProperty("name"));//false

    2.原形与in操作符

    alert(name in person1);//true

  • 相关阅读:
    剑指OFFER----面试题17- 打印从1到最大的n位数
    剑指OFFER----面试题16. 数值的整数次方
    剑指OFFER----面试题15. 二进制中1的个数
    剑指OFFER----面试题14- II. 剪绳子II
    07 多层if判断
    08 while循环
    06 if 流程控制
    03 身份运算符、逻辑运算符
    04 位运算符、运算符优先级
    02 赋值运算符、成员运算符
  • 原文地址:https://www.cnblogs.com/lovey/p/2257611.html
Copyright © 2011-2022 走看看