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 方法。 

  • 相关阅读:
    u-boot中网口处理--硬件部分
    移动开发
    多台Mac电脑使用一个apple开发者账号
    AppStore苹果应用支付开发(In App Purchase)翻译
    IOS7.1-7.1.1越狱后无法读取越狱文件的解决办法
    【iOS越狱开发】如何将应用打包成.ipa文件
    Xcode 证书生成、设置、应用
    iOS 证书与签名 解惑详解
    打包iOS应用程序
    什么是KBEngine
  • 原文地址:https://www.cnblogs.com/spectre/p/2959330.html
Copyright © 2011-2022 走看看