js:对象

202 阅读5分钟

对 象

面向对象

面向对象程序设计(oop)是一种计算机编程架构,它的基本原则是计算机由单个能够起到子程序作用的单元或对象组合而成。oop达到了软件工程的三个主要目标:重用性、灵活性和扩展性,其核心概念是类和对象。

对象

人们所研究的事物的本身就是对象。例如一个人,一只猫,一段代码。对象包含自身的属性、方法、实现数据和操作的结合。

对相同特征和行为的对象的抽象。比如:单身的人,中华田园猫等。

对象和类的关系

类的实例就是对象。也可以理解为类是模具,对象是根据模具创造出来的东西。

举个栗子

//这是一个person类
class person{
    name=String;
    age=Number;
static run(){
console.log('run')
}
}
//keven是一个对象,一个具体的人
const keven=new person()

面向对象的特点

继承

子类继承父类的特性和行为,子类也可以含有自己的特征和行为

子类继承了父类的特征和行为,虽然没有
  class YellowPerson extends Person{
        speak(){}
    }
console.log(YellowPerson.run)

多态

子类重写父类,继承同一个父类的子类对同一个特性或行为表现的不同

子类继承了父类,但子类对同一个特性run的表现不同。
class YellowPerson extends Person{
        run(){
        console.log('跑')
        }
    } 

封装

内部实现细节对外部隐藏,使用属性描述来控制成员的访问,属性描述符一般有private、protected、public

class Person {
private assets: number; // 他有很多资产,除了他自己,并不想让任何人(包含自己的家人)知道 
protected houseKey: string; // 这个人不想让外人知道自己家的钥匙,除非是自己的家人,例如他的儿子 
public name: string; // 他的名字任何人都可以知道 
}

javascript 对象

JavaScript的数据类型可以分为基本数据类型和复杂数据类型。 基本数据类型: number,string,boolean,null,undefind, symbol. 复杂数据类型:object (数组,函数,对象)

如何创建一个对象

 // 字面量,比较常用 
const obj={} 
const obj= new Object()
const obj = new person()
const obj =Object.create(null)

JavaScript中对象的属性和方法

javascript中的属性和方法访问可以用.和[] 访问。

var obj={
a:2
}
obj.a //2 
obj['a'] //2

.a语法通常被称为属性访问。['a'] 通常被称为键访问。

两种访问的区别。 。访问需要属性名满足标识符命名规范;键访问可以接受任意utf-8字符串作为属性名。

属性的描述符

     var obj={
         a:2
     }

console.log(Object.getOwnPropertyDescriptor(obj,'a')) 

// configurable: true
  enumerabletrue
 value2
  writabletrue

这个普通属性对应的描述符不仅仅是一个2,还包含了writable(可写),enumerable(可枚举),configurable(可配置)

var obj={}
Object.defineProperty(obj,'a',{  
     value2,
     writable:false,
})  
obj.a=4
console.log(obj.a)// 2

对于属性值的修改失败了。在严格模式下,对值的修改会报错。obj.a=4//typeError ## 原型 每个 Javascript 对象,都有一个  [[Prototype]] 的特殊属性, 这就是对象的原型。「[[Prototype]] 本质上是对其他对象的引用」。

「原型链」每个对象都存在特殊属性 [[Prototype]],[[Prototype]] 指向另一个对象,另一个对象也存在 [[Prototype]] 属性...直到为 null 结束,由此对象组成的原型链接就是原型链

「原型链查找」在 [[GET]] 时,如果当前对象不存在该属性,且该对象的 [[Prototype]] 不为空,则会继续沿着 [[Prototype]] 引用的对象继续查找,直到找到该属性或对象为空为止.

function person{}
person.prototype.xx=xx
person通过[[prototype]]指向person.prototype,从而访问prototype对象
var  person=new person ()

javascript 的类

JavaScript没有类的概念,对象是由new构造调用 构造函数生成对此昂。在es6之后,可以使用class了,name是不是意味着JavaScript在Es6之后就有类了么?

JavaScript没有类,JavaScript中的class也只是模拟类的而已

实例化

类在面向对象中,类是一个模具,通过 模具生成事物的步骤叫实例化。生成对象后对象和类互不影响,且对象之间会不影响。

JavaScript生成对象时靠的是构造调用,而非实例化。JavaScript生成对象不需要依靠类,而是直接生成,生成后通过[[prototype]]来模拟类,由于[[prototype]]是prototype的引用,所以对象和类。对象之间可以互相影响。

   function person(age){
            this.age=age
        }
        person.prototype.ind=[1,2,3]
        var p=new person()
        p.ind.push(4)
        var p2=new person()
      console.log(p2.ind)  //[1,2,3,4] 对象之间互相印象了

继承

类 的继承,子类继承父类的属性和方法、

JavaScript继承后子类并不是继承父类的属性和方法,而是依靠[[prototype]]去访问父类的prototype。

    function person(age){
            this.age=age
        }
   // 原型继承
function YellowPerson() {}
YellowPerson.prototype = new Person();
YellowPerson.prototype.constructor = YellowPerson;

多态

类 通过函数重载实现多态

Javascript"类" 通过 [[GET]] 操作时,如果已找到该属性,则不会沿着 [[Prototype]] 继续查询的特性,来实现多态。

JavaScript面向委托

面向委托:某些对象在自身无法寻找属性和方法时,把该请求 委托给另一个对象--你不知道的JavaScript。

var person = {
showAge() {
return this.age;
},
};
var yellowMan = Object.create(Person); 
yellowMan.age = 22; // yellowMan 自己不包含 age 属性,依靠 [[Prototype]] 访问 person 的 age 属性。

面向对象和面向委托的区别:

面向对象:利用父类保存属性和方法,在利用多态来实现不同的操作。

面向委托:最好将状态保存在委托者上,而不是委托对象。