首页 > 其他分享 >js高级之对象高级部分

js高级之对象高级部分

时间:2022-11-09 10:13:19浏览次数:66  
标签:function name 对象 age 高级 js Person 类型 构造函数

基于尚硅谷的尚硅谷JavaScript高级教程提供笔记撰写,加入一些个人理解

github源码
博客下载

对象的创建模式

Object构造函数模式

  • 套路: 先创建空Object对象, 再动态添加属性/方法
  • 适用场景: 起始时不确定对象内部数据
  • 问题: 语句太多
var obj = {};
obj.name = 'Tom'
obj.setName = function(name){this.name=name}

对象字面量模式

  • 套路: 使用{}创建对象, 同时指定属性/方法
  • 适用场景: 起始时对象内部数据是确定的
  • 问题: 如果创建多个对象, 有重复代码
var obj = {
  name : 'Tom',
  setName : function(name){this.name = name}
}

工厂模式(不常用)

  • 套路: 通过工厂函数动态创建对象并返回
  • 适用场景: 需要创建多个对象
  • 问题: 对象没有一个具体的类型, 都是Object类型
    function createPerson(name, age) {
      var obj = {
        name,
        age,
        setName: function (name) {
          this.name = name
        }
      }
      return obj
    }

构造函数模式

  • 套路: 自定义构造函数, 通过new创建对象
  • 适用场景: 需要创建多个类型确定的对象
  • 问题: 每个对象都有相同的数据, 浪费内存
function Person(name, age) {
  this.name = name;
  this.age = age;
  this.setName = function(name){this.name=name;};
}
new Person('tom', 12);

构造函数+原型的组合模式

  • 套路: 自定义构造函数, 属性在函数中初始化, 方法添加到原型上
  • 适用场景: 需要创建多个类型确定的对象
function Person(name, age) {
  this.name = name;
  this.age = age;
}
Person.prototype.setName = function(name){this.name=name;};
new Person('tom', 12);

继承模式

原型链继承 : 得到方法

  • 定义父类型构造函数
  • 给父类型的原型添加方法
  • 定义子类型的构造函数
  • 创建父类型的实例对象赋值给子类型的原型
  • 将子类型原型的构造属性设置为子类型
  • 给子类型原型添加方法
  • 创建子类型的对象: 可以调用父类型的方法
关键
  • 子类型的原型为父类型的一个实例对象
//父类型
    function Supper() {
      this.supProp = 'Supper property'
    }
    Supper.prototype.showSupperProp = function () {
      console.log(this.supProp);
    }

    //子类型
    function Sub() {
      this.subProp = 'Sub property'
    }
    Sub.prototype = new Supper()// 子类型的原型为父类型的实例
    Sub.prototype.constructor = Sub// 子类型的原型的constructor指向子类型 
    Sub.prototype.showSubProp = function () {
      console.log(this.subProp);
    }
    var sub = new Sub()
    sub.showSupperProp()// 调用父类型原型上的方法

借用构造函数 : 得到属性(假继承)

  • 定义父类型构造函数
  • 定义子类型构造函数
  • 在子类型构造函数中调用父类型构造
关键
  • 在子类型构造函数中通用call()调用父类型构造函数
    function Person(name, age) {
      this.name = name
      this.age = age
    }

    function Student(name, age, price) {
      Person.call(this, name, age)   // 相当于this.Person(name, age)
      this.price = price
    }

    var s = new Student('Tom', 20, 12000)
    console.log(s.name, s.age, s.price)

组合

  • 利用原型链实现对父类型对象的方法继承
  • 利用call()借用父类型构建函数初始化相同属性
    function Person(name, age) {
      this.name = name
      this.age = age
    }
    Person.prototype.setName = function (name) {
      this.name = name
    }

    function Student(name, age, price) {
      Person.call(this, name, age) //得到父类型的属性
      this.price = price
    }
    Student.prototype = new Person()  //得到父类型的方法
    Student.prototype.constructor = Student
    Student.prototype.setPrice = function (price) {
      this.price = price
    }

    var s = new Student('Tom', 12, 10000)
    s.setPrice(11000)
    s.setName('Bob')
    console.log(s)
    console.log(s.constructor)

new一个对象背后做了些什么

  • 创建一个空对象
  • 给对象设置__proto__, 值为构造函数对象的prototype属性值 this.proto = Fn.prototype
  • 执行构造函数体(给对象添加属性/方法)

博客下载

标签:function,name,对象,age,高级,js,Person,类型,构造函数
From: https://www.cnblogs.com/SakuraCaslana/p/16872611.html

相关文章

  • 从6个方面净化你的Js代码
    记录一下怎样写出整洁规范的代码,用于共勉进步。对于什么是整洁的代码,书中给出了大师们的总结:BjarneStroustrup:优雅且高效;直截了当;减少依赖;只做好一件事Gradybooch:简单直接......
  • 面试官:在 Java 中 new 一个对象的流程是怎样的?彻底被问懵了。。
    对象怎么创建,这个太熟悉了,new一下(其实还有很多途径,比如反射、反序列化、clone等,这里拿最简单的new来讲):Dogdog=newDog();我们总是习惯于固定语句的执行,却对于背后......
  • js提交数据
    一、from表单提交<formaction=""method="post"enctype="multipart/form-data"><inputtype="submit"class="btnbtn-info">属性:action:是form表单提交数据的......
  • 使用jwt鉴权(jsonwebtoken)
    1.下载jsonwebtokennpmi-Sjsonwebtoken2.引用constjwt=require('jsonwebtoken');3.需要设置秘钥constsecretKey='3.14159263528542852651268541';4.设......
  • 前端零配置打包工具 parceljs 体验
    参考https://www.parceljs.cn/getting_started.htmlparceljs中文官网https://www.parceljs.cn/getting_started.htmlParcel1版本的中文文档https://v2.parceljs.cn......
  • Java类与对象
    1:初学JAVA,都知道JAVA是面向对象的编程。笔者这节开始说说类和对象。(实例仅供参考,如若复制粘贴记得修改包名和类名,避免出错)学习JAVA的快捷键,Alt+/代码补全功能,其实此快捷键......
  • js小知识点
    01.thisthis的指向完全由函数在哪里调用决定。在ES5中,this永远指向调用它的那个对象;在ES6的箭头函数中没有this绑定,this指向箭头函数定义时作用域中的this;判断this的......
  • 谈谈js中this的理解
    this一、this的理解第一准则:this永远指向函数运行时所在的对象,而不是函数被创建时所在的对象【不包含箭头函数】二、this的集中指向:window对象如:console.log......
  • Java基础---面向对象编程
    什么是面向对象?1.面向过程思想答:线性过程第一步做什么第二步做什么2.面向对象思想答:物以类聚有,分类的思维模式,思考问题首先解决问题需要哪些分类,然后对这些分类进行......
  • 《ASP.NET Core技术内幕与项目实战》精简集-高级组件4.4:消息推送SignalR
    本节内容,部分为补充内容。主要NuGet包:Microsoft.AspNetCore.SignalR.Client(BlazorWASM的SignalR客户端)Microsoft.AspNetCore.SignalR.StackExchangeRedis(使用Redis部署......