0
点赞
收藏
分享

微信扫一扫

JS原型与原型链

栖桐 2022-03-14 阅读 150

一、原型与原型链

        1.JS是基于原型的一门语言,在软件设计模式中,有种模式叫原型模式,JS就是通过该模型创建出来的,原型模式是用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。

                原型=指定=》对象=拷贝=》新对象

        2.原型模式是用于创建重复的对象,同时又能保证性能,这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。这种模式是实现一个原型接口,该接口用于创建当前对象的克隆,原型模式的目的就是用原型实例指定对象的种类,并且通过拷贝这些原型创建新的对象,也就是说利用已有的一个原型对象,可以快速的生成和原型对象一样的新对象实例

        3.原型:一个可以被复制的一个类,通过复制原型可以创建一个一模一样的新对象,也就是说原型就是一个模板,在设计语言中更准确的说是一个对象模板

                (1)原型是定义了一些共用的属性和方法,利用原型创建出来的新对象实例会共享原型的所有属性和方法

//创建一个原型
var Person=function(name){
    this.name=name
}
//创建原型上的方法
Person.prototype.sayHello=function(){
    console.log(this.name+',你好');
}
//实例化创建新的原型对象,新的原型对象会共享原型的属性和方法
var person1 = new Person('小陈')
var person2 = new Person('小马')
//触发原型对象上的方法
person1.sayHello()//小陈,你好
person2.sayHello()//小马,你好

                (2)严格模式下,原型的属性和方法还是会被原型实例所共享

                (3)通过原型创建的新对象实例是相互独立的,为新对象实例添加的方法只有该实例拥有这个方法,其他实例是没有这个方法的

//创建一个原型
var Person=function(name){
    this.name=name
}
//创建原型上的方法
Person.prototype.sayHello=function(){
    console.log(this.name+',你好');
}
//实例化创建新的原型对象,新的原型对象会共享原型的属性和方法
var person1 = new Person('小陈')
var person2 = new Person('小马')
//触发原型对象上的方法
person1.sayHello()//小陈,你好
person2.sayHello()//小马,你好
//为新对象实例添加方法
//通过原型创建的新对象实例都是相互独立的
person1.getName=function(){
    console.log(this.name);
}
person1.getName()//小陈
person2.getName()//person2.getName is not a function

                (4)js的对象都是构造函数生成的 这个构造函数就有个prototype属性 当你new一个实例时,实例就会共享构造函数prototype上的方法和属性;并且他有个__proto__属性指向他的上一层

//创建一个原型
var Person=function(name){
    this.name=name
}
//创建原型上的方法
Person.prototype.sayHello=function(){
    console.log(this.name+',你好');
}
//实例化创建新的原型对象,新的原型对象会共享原型的属性和方法
var person1 = new Person('小陈')
var person2 = new Person('小马')
//触发原型对象上的方法
person1.sayHello()//小陈,你好
person2.sayHello()//小马,你好
//js的对象都是构造函数生成的 这个构造函数就有个prototype属性 当你new一个实例时,实例就会共享构造函数prototype上的方法和属性;并且他有个__proto__属性指向他的上一层
person1.__proto__.getName=function(){
    console.log(this.name);
}
person1.getName()//小陈
person2.getName()//小马

                (5)原型的总结:

                        所有引用类型都有一个_proto_(隐式原型)属性,属性值是一个普通的对象

                        所有函数都有一个prototype(显式原型)属性,属性值是一个普通的对象

                        所有引用类型的_proto_属性指向它构造函数的prototype,也就是指向这个实例的上一层

                (6)函数的原型对象_proto_:所有对象都有_proto_属性,当用构造函数实例化(new)一个对象时,会将新对象的_proto_属性指向构造函数的prototype

                (7)原型对象和函数的原型关系

                        所有函数的_proto_都是指向function的prototype

                        构造函数new出来的对象_proto_指向构造函数的prototype

                        非构造函数实例化出的对象或者对象的prototype的_proto_指向Object的prototype

                        Object的prototype指向null

                (8)所有的原型对象都会自动获得一个 constructor(构造函数)属性,这个属性(是一个指针)指向 prototype 属性所在的函数(Person)

                (9)实例的构造函数属性(constructor)指向构造函数 :person1.constructor == Person

      (10)原型对象(Person.prototype)是 构造函数(Person)的一个实例

                (11)原型的分类

                        

        

                      

举报

相关推荐

0 条评论