js----面向对象(二)

80 阅读1分钟

字面量创建数据和实例的方式创建数据

实例的创建方式 通过new操作符调用当前类型的构造函数 会得到当前类型的一个实例

  • 创建引用数据类型
var arr = new Array(1,2,3,4);  //用实例的方式创建数组
arr.push(5);
var arr = [1,2,3,4];
arr.push(5);
  • 创建引用基本类型
var arr = new String('javascript');
console.log(arr.toUpperCase());
var arr1 = 'javascript';
console.log('javascript');
console.log(typeof arr); // 'object'
console.log(typeof arr1); // 'string'

基本数据类型只能呢个ton过字面量方式创建 若用实例的方式创建时 这个实例将会是变成一个对象 而对象不是基本数据类型

字面量创建方式

  • 创建引用数据类型 字面量创建的引用改数据类型和实例的方法创建引用数据类型没有区别
var obj = {};
var arr = [];
var reg = /^\d$/;
  • 创建基本数据类型
var num = 1;
var bool = true;
var sym = Symbol('cdd');

new 调用构造函数和普通调用的区别

  • 函数的普通调用过程
  1. 新开辟栈内存作为执行的作用域
  2. 形参赋值
  3. 私有作用域变量提升
  4. 代码从上到下执行
  5. 释放栈内存
  • new 调用时
  1. 开辟栈内存
  2. 形参赋值
  3. 变量提升
  4. 隐式创建一个实例对象 而且把当前构造函数中的this指向这个实例对象
  5. 执行函数体重的代码 当遇到 this.xxx = xxx时 就是在向实例对象上增加属性
  6. 饮食返回实例对象
  7. 释放栈内存

显示设置返回值

  • 返回基本数据类型
function Stu(name,age.sex){
    this.name =name;
    this.age = age;
    this.sex = sex;
    this.learn = ()=>{
        console.log(`${name}年龄${age}`);
    }
    return 1;  //返回基本数据类型
}
let a = new Stu('zhangsan',13,'boy');
console.log(a);  //Stu{...}
  • 返回引用数据类型
function Stu(name,age,sex){
     this.name =name;
    this.age = age;
    this.sex = sex;
    this.learn = ()=>{
        console.log(`${name}年龄${age}`);
}
return {heh:'哈哈'};
}
let a = new Stu('张三',12,'js');
console.log(a);  //{hah:...}
  • 若 return一个基本数据类型的值 无影响 不会覆盖原有实例
  • 若 return 引用数据类型 原有的实例就会被覆盖 慎重修改构造函数的返回值

原型模式

  • 原型对象 原型prototype:每一个函数(普通函数、构造函数【类】)都天生自带一个属性prototype(原型)。 这个属性的值是一个对象,用来存储当前类型的共有的属性和方法。保存在原型上面的属性和方法称为公有属性或公有方法。
function Stu(name,age,sex){
    this.name = name;
    this.age = age;
    thia.sex = sex
}
Stu.prototype.learn = ()=>{
    console.log(`${this.name}年龄 ${this.age}`);
}
let t1 = new Stu('zhangsan',13,'girl');
let t2 = new Stu('lisi',14,'boy');
t1.teach();
t2.teach();
cobsole.log(t1.teach===t2.teach); //true

检测属性是公有的还是私有的

hasOwnProperty()方法 检测某个属性是否是对象的私有属性 是 返回true

原型链 对象的属性查找机制

每一个实例都有一个属性__proto__属性 它指向当前实例所属类的prototype对象 当我们访问对象的一个属性时 若有 就使用私有属性 若没有就通过实例__proto__找到实例所属类的prototype上查找 若找到了就使用原型上的属性 若没有找到 就通过prototype的__proto__继续向上查找 一直找到Object的prototype 就停止查找 若还没有找到就返回undefined