zoukankan      html  css  js  c++  java
  • Js面向对象

    今天R神打电话跟我说 Js面向对象。下午又不想研究对讲的程序。学一下吧

    Js 创建对象的几种方法。

    1. 这里先定义o为一个空的对象,然后为o设置了一堆属性。

    function createPerson(name,age,job){ 
    var o = {}; 
    o.name = name; 
    o.age = age; 
    o.job = job; 
    o.sayName = function(){ 
    alert(this.name); 
    }; 
    return o; 

    var tanya = createPerson("tanya","30","female"); 
    var ansel = createPerson("ansel","30","male"); 
    tanya.sayName(); 
    ansel.sayName();

    2.其实也可以直接给o属性的嘛,所以如果这样写也是ok的。

    function createPerson(name,age,job){ 
    var o = { 
    name : name, 
    age : age, 
    job : job, 
    sayName : function(){ 
    alert(this.name); 

    }; 
    return o; 

    var tanya = createPerson("tanya","30","female"); 
    var ansel = createPerson("ansel","30","male"); 
    tanya.sayName(); 
    ansel.sayName();

    3.还有一种办法是利用无敌的this,因为this就表示当前运行时的对象,将构造函数this的作用域指向新对象,将当前运行对象的属性和方法都赋给新对象,这样对象模式称为构造函数模式

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

    var tanya = new Person("tanya","30","female"); 
    var ansel = new Person("ansel","30","male"); 
    tanya.sayName(); 
    ansel.sayName();

    4.  考虑下下面的情况

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

    Person("tanya","30","female"); 
    Person("ansel","30","male"); 
    window.sayName(); 
    window.sayName();

    发现两次弹出的都是ansel,这是因为不用new的话,就不是一个person的实例,而仅仅在执行函数。而在全局作用域调用一个函数时this总是指向Global对象。而Global对象在浏览器中就是window对象。 
    我们还可以用构造模式在另外一个对象中调用sayName方法,还记得Apply和call么,来吧再考虑另外一种情况,

    5.

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

    var olivia = {}; 
    Person.call(olivia,"tanya","30","female"); 
    olivia.sayName(); 
    var philip = {} 
    Person.apply(philip,["ansel","30","male"]); 
    philip.sayName();

    6.原型模式就要考虑原型链了,分析一下,sayName方法在实例中被重复定义了两次,但其实没有必要创造两个一样的副本。使用原型方法,可以使是tanya和ansel的共享一个sayName方法。 
    于是原型模式的写法如下:

    function Person(name,age,job){ 
    this.name = name; 
    this.age = age; 
    this.job = job; 

    Person.prototype.sayName= function(){ 
    alert(this.name); 
    }; 
    var tanya = new Person("tanya","30","female"); 
    var ansel = new Person("ansel","30","male"); 
    tanya.sayName(); 
    ansel.sayName();

    7. 应该还可以这么写。

    function Person(name, age, job) {
    this.name = name;
    this.age = age;
    this.job = job;

    if (typeof sayName != "function") {
    this.sayName = function () {
    alert(this.name);
    }
    }

    }

    var tanya = new Person("tanya", "30", "female");
    var ansel = new Person("ansel", "30", "male");
    tanya.sayName = function () {
    alert("Hello");
    };
    tanya.sayName();
    ansel.sayName();

    小结:函数的call,apply 方法。 

  • 相关阅读:
    C#枚举扩展方法,获取枚举值的描述值以及获取一个枚举类下面所有的元素
    C#对IQueryable<T>、IEnumerable<T>的扩展方法
    C#常用处理数据类型转换、数据源转换、数制转换、编码转换相关的扩展
    C#常用8种排序算法实现以及原理简介
    身份证号合法性验证,支持15位和18位身份证号,支持地址编码、出生日期、校验位验证
    C#检验参数合法性公用方法
    MVC中得到成员元数据的Description特性描述信息公用方法
    把对象类型转换成指定的类型帮助类方法
    C#操作图片帮助类
    C#执行Dos命令公用方法
  • 原文地址:https://www.cnblogs.com/spectre/p/2959330.html
Copyright © 2011-2022 走看看