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();

 

 

原文地址:https://www.cnblogs.com/Adam-Ye/p/11166211.html