美文网首页
单信js——2原型(重点)

单信js——2原型(重点)

作者: 随风飞2019 | 来源:发表于2019-08-05 10:42 被阅读0次

面向对象

编程语言中,分为“面向过程”和“面向对象”两大类。面向过程就如自己造一台电脑,面向对象则是用现有的配件组装电脑。
在面向对象中就有两个重要的概念:类型(class)和对象实例(object)
一个类,通常具有两大特征:属性 和 方法。
属性:是指一个类型具有的共同“特征”。如人有2个眼睛,汽车有4个轮子等。
值是各种基本类型,引用类型
方法:是指一个类型具有的共同“行为”。如人能说话,狗能吃骨头等。
值是一个函数
如果想创建属于自己的对象,那么首先要体验分析。分析身边2件事物,抽取出他的属性和方法。
JavaScript的所有类型,都源于一个Object,也就是我们常说的万物皆对象。

JS提供了非常多内置的类:
Number(数字类)、String(字符串类)、Date(日期类)、Math(数学类)、Array(数组类)、Function(函数类)、Object(对象类)
new关键字:
使用new关键词可以将一个类进行实例化,根据类的特征和行为制作一个具体实例。
//可以使用new关键词用函数类实例化一个函数 : new Function('参数','函数体');
var show=new Function('a','alert(a);')
show(10);
console.log(show instanceof Function);

自定义类:

1.字面量对象
var obj2={name:'李白',age:999};

  1. 工厂模式
    就是设计中的工厂模式,给定一些值,创造一个结果

  2. 构造函数/类
    //ES5 【掌握】
    function Person(参数){
    this.属性=参数值;
    this.方法=function(){
    //方法体
    }
    }
    //使用构造函数实例化一个对象
    var p1=new Person('小强',19);

类/构造函数的特征:
1) 构造函数的函数名(类名)首字母大写
2) 属性和方法都挂在this上
3) 没有return 语句

new关键字的实现机制:
1) 创建一个新对象
2) 将构造函数中的this指向新对象
3) 执行构造函数中的语句,将所有属性都挂到新对象(this指向新对象)

为每一个对象都创建一个单独的方法,就会占用过多的内容,就叫做过载。解决的办法是,在原型对象prototype上添加方法,给每个实例对象使用。

原型prototype:

  1. 什么是原型?
    原型就是 prototype属性,所有function定义的函数都拥有这个属性。
    prototype属性是一个对象,可以添加属性和方法

  2. 原型有什么用?

    1. 解决方法过载的问题
    2. 扩展类的功能
  3. 原型的写法
    //定义原型方法
    类名.prototype.属性名或方法名=值;

    //使用原型方法
    对象.方法名();
    function Person(name,age){
    this.name=name;
    this.age=age;
    }

//将所有的方法都放在原型上
Person.prototype.run=function(){
    console.log(this.name + '以每小时80公里的速度奔跑...');
};
Person.prototype.eat=function(){
    console.log(this.name+'吃了一惊!!');
};
//为Person添加一个新功能——学习方法
Person.prototype.study=function(){
    console.log(this.name+'正在努力学习!!!');
}
var p1=new Person('刘备',18);
var p2=new Person('张飞',16);
console.log(p1.run === p2.run);   //true
console.log(p1);    //刘备的对象
p1.study();   //刘备正在努力学习!!!
var Car = function (band,price) {
            this.band=band;
            this.price=price
        }
        var bens=new Car("meisai",56);
        console.log(bens);
        console.log(typeof bens);
        console.log(bens instanceof Car);        //true
        console.log(bens instanceof Object);     //true
        console.log(bens instanceof Function);   //false
        console.log(Car instanceof Object);      //true
        console.log(Car instanceof Function);    //true
        //此时,如果Car的原型上添加东西,即可扩展到bens上
        Car.prototype.color="white";
        console.log(bens.color);//父亲的属性或方法,都可以被儿子继承
        console.log(bens.constructor==Car);      //true
        console.log(bens.constructor==Car.prototype.constructor);   //true

        console.log(Car.prototype.color);    //white

扩展内置类

扩展String类,编写方法实现获取字符串的第一个字
var str="我们在上课,好海哦~~~";         
//对字符串类进行扩展(编写插件)
var str="我们在上课,好海哦~~~";
//对字符串类进行扩展(编写插件)
String.prototype.findFirst=function(){
    return this.substr(0,1);
}
console.log( str.findFirst() );
console.dir(String); //查看对象的结构

扩展Array类型,提供inArray方法用来检查数组中是否包含”张三”
Array.prototype.inArray=function(name){
//找到数组 this
for(var i=0;i<this.length;i++){
    if(this[i] === name){
        return true;
    }
}
//将数据遍历完还找不到,就返回false
return false;
}
var arr=['刘备','张飞','张三','关羽'];
console.log( arr.inArray('张三') );  //true

对象属性的优先级:
对象 > 构造函数 > 原型 > 原型链(父类原型)

神秘的proto

proto实际上是对类的prototype属性进行引用!!!

proto出现在【对象】上,
prototype出现在【类/构造函数】上, 对象上的_proto实际上是对类的prototype进行引用(内存地址都一样)

常见属性:constructor    在原型上声明构造函数
function User(username,password){
this.username=username;
this.password=password;
}
User.prototype.login=function(){
console.log(this.username+'登陆了系统');
}
var u1=new User('曹操','123456');
console.log(u1.__proto__ === User.prototype); //true
console.dir(u1);

下面是前两天的复习:

  1. 变量高级

    1. 按数据类型进行划分,将变量划分为:
      Number String Boolean Undefined NULL Array Function Object

    2. 按数据在内存中的存储位置划分:
      基本类型(简单类型):
      存储在内存的栈里面,在赋值时直接将变量的值复制一份给另外一个变量,两个变量相互不影响。
      包含: Number String Boolean Undefined NULL

      引用类型(复杂类型):
      存储在内存堆里面,在赋值时将变量指向的内存地址(指针)赋值给另外一个变量,两个变量指向同一个内存空间,相互会影响
      包含:Array Function Object

    3. 检测变量
      typeof 检测变量自身的类型
      instanceof 检测变量属性哪种类型

  2. 函数进阶

    1. 函数的内置对象 arguments
      a. 什么是arguments
      arguments是函数的内置对象,只能在函数内部使用,不能在外部使用。
      是一个对象,表现起来像一个数组,就是伪数组。

      b. arguments的作用
      获取函数的所有实际参数
      调用到函数本身(开发测试时使用)

      c. 写法
      function show(){
      console.log(arguments);
      //arguments[0]
      //注意:遍历arguments不能用for in,使用传统的for循环
      }

  3. 面向对象
    面向过程POP: 关注每一个过程和细节
    面向对象OOP: 关注结果,找一个具备相关能力的对象,使用这个能力实现目标
    $('div').html('Hello world')

    类(class):类是一个抽象化的概念, 将一类事物共有的特征进行抽取,得到类(对一类事物进行描述)
    对象(object):对象是一个具体的实例,可以将类进行实例化产生一个对象,对象具备类上面描述的所有特征

  4. 构造函数/类

    1. 创建类/构造函数
      function Person(name,age){
      //定义成员属性 => 特征 => 普通变量
      this.name=name;
      this.age=age;
      //定义成员方法 => 行为 => 函数
      this.showName=function(){
      }
      }

    2. 使用构造函数
      var p1=new Person('张三',1);

    3. 构造函数的特征
      a. 类名就是构造函数名 首字母必须大写
      b. 所有属性和方法都挂载到this上
      c. 没有返回值 return

  5. 原型prototype

    1. 什么是原型?
      原型就是prototype属性,
      所有的函数都拥有这个属性,
      prototype属性是一个对象,可以添加属性和方法,称为原型属性和原型方法,
      prototype属性会被实例化出来的对象所引用

    2. 原型的作用
      a. 解析方法过载的问题
      b. 对已有的类进行扩展(内置类、自定义类)

    3. 原型的写法
      function Person(name,age){
      this.name=name;
      this.age=age;
      }

      //将所有类的方法都定义在原型上
      Person.prototype.showName=function(){
      //...
      }

相关文章

  • 单信js——2原型(重点)

    面向对象 编程语言中,分为“面向过程”和“面向对象”两大类。面向过程就如自己造一台电脑,面向对象则是用现有的配件组...

  • 2020-06-01 学习计划

    1、js:红宝书,重点:原型,继承,闭包,设计模式 2、webpack: 打包原理,性能优化,配置,插件,看视频 ...

  • 重点--原型2

  • 深入javascript之原型和原型链

    原型和原型链是js中的难点也是重点,明白了原型和原型链会让我们在后面不管是学习还是工作都会更加高效,并且原型和原型...

  • 廖雪峰JS小记

    (function(){})() 原型,原型链 浅谈Js原型的理解JS 原型与原型链终极详解 对象 对象:一种无序...

  • js的4种设计模式及Vue小结(1)

    4种js设计模式 模块模式(module) 原型模式(prototype) 观察者模式(observer) 单例模...

  • 大白话通俗易懂的讲解javascript原型与原型链(__pro

    javascript原型和原型链是js中的重点也是难点,理论上来说应该是属于面向对象编程的基础知识,那么我们今天为...

  • 继承方式

    js继承的6种方式 想要继承,就必须要提供个父类(继承谁,提供继承的属性) 一、原型链继承 重点:让新实例的原型等...

  • Javascript基础篇

    本文主要介绍Javascript(interview)基础语法。 1.原型 和 原型链 2.继承 2.1 js的继...

  • JS数组

    JS中其实没有真正的数组,JS的数组是用对象模拟的。重点理解splice和reduce 如果一个数字的原型链中没有...

网友评论

      本文标题:单信js——2原型(重点)

      本文链接:https://www.haomeiwen.com/subject/nnupdctx.html