zoukankan      html  css  js  c++  java
  • javascript基础学习五-原型prototype


    1、js的对象比较   a) 由于js是解释执行的语言,那么在代码中出现函数与对象如果重复执行,那么会出现多个副本。 2、在代码中重复执行的代码容易出现重复对象 3、创建一个Person构造函数,以创建对象,要求 4、传统的构造方法的定义方式会影响性能,容易造成多个对象有多个副本,应该将方法抽取出来,让所有的对象共享。
    function sayHello() {
       console.log("dshjgksajd")//方法共享,若放在构造函数里则表示不共享,在new对象时会创建副本
    function Person(name,age,gender) {
        this.name = name;
        this.age = age;
        this.gender = gender;
        this.sayHello =sayHello;
        };
    }
          var p1 = new  Person(); 

    5、可以考虑将方法全部放到外面但是有安全隐患

      a) 在开发中会引入各种框架或库。自定义的成员越多,出现命名冲突的几率越大

      b) 可能在开发中会有多个构造函数 。每一个构造函数应该有多个方法。那么就会变得不容易维护。

    6、任意一个对象都会默认的连接到它的原型中(默认继承object==任意对象的原型)

      a) 创建一个函数,会附带的创建一个特殊的对象。该对象对象使用函数.prototype引用Var o = { };O = null;称其为函数的原型属性

      b) 每一个由该函数作为构造函数创建的对象,都会默认的来连接到该对象上。

      c) 在该对象访问某一个方法或属性的时候,如果该对象中没有,就会到原型对象中去查找。

    7、传统构造函数的问题

      遍历旧数组,然后在新数组中找是否已存在该数据

    DOM操作

    a) 先获取元素,设置或修改属性或子节点

    Function Foo(){
    This.sayHello = function( ) { }
    }

    a) 由于对象是调用‘new Foo()所创建出来的。因此在每一个对象创建出来的时候,函数sayHello都会被创建一次

    b) 那么每一个对象都含有一个独立的,不同的,但是功能逻辑一样的函数。比如:“{ }=={ }”

    c) 在代码中方法就会消耗性能。最典型的资源就是内存。

    d) 这里最好的办法就是将函数体放在构造函数之外。那么在构造函数中,只需要引用该函数即可

    Function sayHello(){}
    Function Foo(){
    This.sayHello = sayHello;
    }

    但是这样会在开发中变得困难:引入框架危险,代码繁冗不好维护。解决办法就是外面的函数如果不占用名字,而且在函数旗下就好了

    e)每一个函数在定义的时候,都有一个原型对象被创建出来。

      每一个有构造函数创建出来的对象都会默认的连接到该原型对象上。

    Var f1 = new Foo();
    Var f2 = new Foo();

    F1.sayHello();//如果f1没有该方法,那么就会在Foo.prototype中去找

    由构造函数创建出来的众多对象,就是构造函数。Prototype

    只需要将共享的东西,重复会多占用内存的东西放到构造函数。prototype中那么所有对象就可以共享了

     

    常见错误

    1、写构造函数。prototype的时候,将属性也加到里面
    a)function Person() {}
            Person.prototype.name = 'ahsj';
            var p = new Person();
    2、赋值错误
    a) function Person() {}
            Person.prototype.name = '正式';
            var p1 = new Person();
            var p2 = new Person();
            p1.name = '李四';
            
            //如果访问数据,当前对象中如果没有该数据就到构造函数的属性中去找
            //如果是写数据,当对象中有该数据的时候,就是修改值;如果没有该属性就是添加值。

     

    关于面向对象

    1、class:在js中就是构造函数

    a) 在传统的面向对象中,使用类定义模版,然后用模版创建对象

    b) js构造方法中也具有类似的功能

    java中,最小的代码单位是类

     

    原型相关概念

    1、原型对象针对构造函数成为原型属性

      a) 原型对象就是构造函数的原型属性

      b) 简称属性

    2、原型对象与构造函数所创建的对象也有一定关系

    一些问题:

    1、{ }构造函数是什么

    2、凡是字面量的对象都有构造函数

      a) { } object

      b) [ ]array

      c) /./ RegExp

      d) function Function

    如何使用原型?

    减少重复函数占用内存

    1、利用对象的动态特性

      a) 构造函数。Prototype.Xxx=vvv

    2、利用直接替换

      a) Student.Prototype = { };

    代码

    function Person () {}
            Person.prototype.func = function () {
                console.log(11111);
            };
            var p1 = new Person();
            Person.prototype = {
                func : function () {
                    console.log(22222);
                }
            };
            var p2 = new Person();
            p1.func();
            p2.func();

     

     

  • 相关阅读:
    生成排列与生成子集
    赛后总结AtCoder Beginner Contest 090(Beginner)
    树状数组笔记
    论怎么记住tarjan的板子
    tarjan缩点-受欢迎的牛-笔记
    tarjan模板(%%%hzwer)-2.0
    tarjan模板(%%%hzwer)
    匈牙利算法学习笔记
    最短路-Car的旅行路线
    数据结构 笔记1 搜索树
  • 原文地址:https://www.cnblogs.com/Adam-Ye/p/11166211.html
Copyright © 2011-2022 走看看