zoukankan      html  css  js  c++  java
  • js构造函数+原型

    注:普通对象与函数对象

    var o1 = {}; 
    var o2 =new Object();
    var o3 = new f1();
    
    function f1(){}; 
    var f2 = function(){};
    var f3 = new Function('str','console.log(str)');
    
    console.log(typeof Object); //function 
    console.log(typeof Function); //function  
    
    console.log(typeof f1); //function 
    console.log(typeof f2); //function 
    console.log(typeof f3); //function   
    
    console.log(typeof o1); //object 
    console.log(typeof o2); //object 
    console.log(typeof o3); //object

    在上面的例子中 o1 o2 o3 为普通对象,f1 f2 f3 为函数对象。每个函数对象自带一个prototype属性,这个属性指向函数的原型对象。

    1、构造函数法

    /**
        * Person类:定义一个人,有name属性和getName方法
       */
        <script>
            function Person(name){
                this.name = name;
                this.getName = function(){
                    return this.name;
                }
            }
    
            //我们在这里实例化几个对象
    
            var p1 = new Person("tom");
            var p2 = new Person("jerry");
    
            console.log(p1 instanceof Person);//true
            console.log(p2 instanceof Person);//true
         console.log(p1.name); //tom
         console.log(p2.getName());//jerry

    </script>

    这里,instanceof用来检测对象p1是否属于Person类。instanceof操作符左边是待检测类的对象,右边是定义类的构造函数。

    优点是:我们可以根据参数来构造不同的对象实例 ,缺点是 : 每次构造实例对象时都会生成getName方法,造成了内存的浪费 。

    我们可以用一个外部函数来代替类方法,达到了每个对象共享同一个方法。

    //外部函数
    <script>
        function getName() {
            return this.name;
        }
    
        function Person(name){
            this.name = name;
            this.getName = getName;//
        }
    </script>

    2、原型方式

    <script>
        function Person(){};
        Person.prototype.name = "tom";//类的属性都放在prototype上
        Person.prototype.getName = function(){
            return " I'm " + this.name;
        }
    
        var p1 = new Person();
        var p2 = new Person();
        console.log(p1.name);//tom
        console.log(p2.getName());//I'm tom
    </script>

    原型方式的缺点就是不能通过参数来构造对象实例 (一般每个对象的属性是不相同的) ,优点是所有对象实例都共享getName方法(相对于构造函数方式),没有造成内存浪费 。

    3、构造函数+原型方式

    取前面两种的优点:
    a、用构造函数来定义类属性(字段)。
    b、用原型方式来定义类的方法。

    <script>
        function Person(name){
            this.name = name;
            Person.prototype.getName = function(){
                return this.name;
            }
        }
    
        var p1 = new Person('tom');
        console.log(p1.getName());//tom
    </script>

    4、Object.create()方法

    用这个方法,"类"就是一个对象,而不是函数。

    var Person = {
            name : "tom",
            age : 21,
            run:  function(){
                alert("I like running");
            }
        }
    var p1 = Object.create(Person);
        alert(p1.age);//21
        p1.run();//I like running

    Object.create()生成实例,不需要用到new。这种方法比"构造函数法"简单,但是不能实现私有属性和私有方法,实例对象之间也不能共享数据,对"类"的模拟不够全面。

  • 相关阅读:
    24. orcle创建备份表
    23. oralce11g导出dmp然后导入Oracle10g
    模板
    日记集
    Outlook 2013 电子邮件账户设置备份与恢复
    Firefox恢复书签
    Windows 7 Professional安装多语言包
    CentOS下成功修复了Windows的grub引导
    CentOS 7修复MBR和GRUB
    从移动硬盘开机,引导VHD(Win10)
  • 原文地址:https://www.cnblogs.com/xiaobaibubai/p/7802673.html
Copyright © 2011-2022 走看看