一、以下摘自javascript高级程序设计(第2 版)===============================================================================
因一些网络上的文字表述总感觉不太准确,影响理解,还是翻开经典才不至于练错了而走火入魔。看网上一些零散的资料还不知道为什么要有或要用“原型和原型链”,看经典才能理清思绪,理清来龙去脉
1、变量包涵两种不同数据类型的值:基本类型值、引用类型值
基本类型值:指那些保存在栈内存中的简单数据段,包括Undefined、Null、 Boolean、Number、String
引用类型值:指那些保存在堆内的对象,需要从栈中读取内存地址再找到堆中的值,对于这种查询变量值的方式,叫做引用访问,相应的这种值叫引用类型值
2、引用类型:引用类型的值(对象)是引用类型的一个实例
A、Object类型:大多数引用类型值都是Object类型的实例
创建Objiec实例的方式:一种是new操作符后跟Object构造函数,一种是对象字面量表示法
B、Array类型:一种使用Array构造函数,一种是数组字面量表示法
C、Date类型:
D、RegExp类型:通过RegExp类型来支持正则表述式
E、Function类型:函数实际上是对象,每个函数都是Function类型的实例。函数名实际上是一个指向函数对象的指针。
可以采用函数声明、函数表达式、Function构造函数 三种方式来定义函数
F、基本包装类型:Boolean、Number、String 与其他引用类型相似,但同时也具有特殊行为。每读取一个基本类型值时后台就会创建一个对应的基本包装类型的对象,从而让我们能调用一些方法来操作数据。
G、内置对象:Global对象、Math对象、
3、所有对象都具有toLocaleString()、toString()、valueOf()方法
4、创建对象:每个对象都是基于一个引用类型创建的,这个引用类型可以是前面第2点所说的原生类型,也可以是开发人员定义的类型。
A、创建对象方法:工厂模式、构造函数模式、原型模式、组合动态原型模式、寄生构造函数模式、稳妥构造函数
原型模式(书中第119页):那么prototype就是通过调用构造函数而创建的那个对象实例的原型对象。
这句话似乎有毛病:前面讲了每个函数都有一个prototype属性,这个属性是一个指针,指向一个对象。所以这句话应该改为“那么prototype指向的对象就是通过调用构造函数而创建的那个对象实例的原型对象”
B、继承:原型链、借用构造函数、组合继承、原型式继承、寄生式继承、寄生组合式继承
我的理解:原型链主要用于继承,而让继承的子原型对象及对象实例有了新的方法、属性。像其它面向对象的语言中可以通过类的继承来实现,而javascript没有类的概念,以下是根据我的理解所画的图:
二、以下摘自网络======================================================================================================
function Person(name,age,job){
this.name = name;
this.age = age;
this.job = job;
this.love = ['qiqi','lili'];
}
Person.prototype = {
constructor : Person,
dream : function(){
console.log(this.love[0]);
}
}
var person1 = new Person('bangbang',18,'programmer');
var person2 = new Person('xiaoya',18,'teacher');
1、
prototype:函数的属性,是一个指针,指向对象,这个对象是通过调用函数的构造函数时创建的对象的原型对象,也就是指向构造函数的原型对象。
__proto__:对象的属性,是一个指针,指向构造函数的原型对象。
综上两点:person1.__proto__ == Person.prototype
2、
1)、使用prototype的好处是可以让所有对象实例共享它所包含的属性与方法
2)、创建自定义类型的最常见方式就是组合使用“构造函数模式”和“原型模式”。以下示例中,dream方法是实例person1与person2共有的,而name,age等可以每个实例不同。
3)、
JavaScript有两种类型机制:基本类型和对象类型。基本类型包括undefined、number、boolean、string、function、object。
JavaScript设计者的本意在于,除了undefined,一切都应该是对象,为了实现这一目标,number、boolean、string这几种基本数据类型通过对应的包装类Number、Boolean、String来变成对象类型数据。
4)、
javaScript中的根对象是Object.prototype对象,Object.prototype对象是一个空的对象。JavaScript的每个对象,实际上都是从Object.prototype对象克隆而来的,Object.prototype对象就是它们的原型。ES5提供了getPrototypeOf来查看对象的原型,Object.getPrototypeOf(任何对象) == Object.prototype都会返回true。
5)、要得到一个对象,不是通过实例化类,而是找到一个对象作为原型并克隆它
6)、JavaScript没有类的概念,new运算符后面的不是类,而是构造器。当使用new运算符来创建对象时,实际上也是先克隆Object.prototype
对象,再进行一些额外操作的过程。
参考资料:
https://www.w3cschool.cn/cduzyh_js/cduzyh_js-26k8244r.html
https://www.jb51.net/article/144485.htm
https://blog.csdn.net/flyingpig2016/article/details/53048394
https://www.w3school.com.cn/js/js_object_prototypes.asp 原型对象