@@ -737,33 +737,79 @@ p1 和 p2 拥有不同的属性值,但是拥有相同的方法;
737737
738738创建自定义类型的最常见方式,就是组合使用构造函数模式与原型模式。构造函数模式用于定义实例属性,而原型模式用于定义方法和共享的属性。结果,每个实例都会有自己的一份实例属性的副本,但同时又共享着对方法的引用,最大限度地节省了内存。另外,这种混成模式还支持向构造函数传递参数;可谓是集两种模式之长。
739739
740- function Person (name, age, job) {
740+ function CreateJsPerson (name, age) {
741741 this.name = name;
742742 this.age = age;
743- this.job = job;
744- this.friends = ["Shelby", "Court"];
743+ this.like =["one","two"];
745744 }
746- Person .prototype = {
747- constructor : Person ,
748- sayName : function(){
749- console.log(this.name);
745+ CreateJsPerson .prototype = {
746+ constructor:CreateJsPerson ,
747+ writeJs: function(){
748+ console.log("my name is " + this.name + ",i can write js 啦!!" );
750749 }
751750 };
752- var person1 = new Person("zhu", 16, "WEB");
753- var person2 = new Person("an", 26, "JAVA");
754- person1.friends.push("Van");
755- console.log(person1.friends); //"Shelby,Count,Van"
756- console.log(person2.friends); //"Shelby,Count"
757- console.log(person1.friends === person2.friends); //false
758- console.log(person1.sayName === person2.sayName); //true
751+ var p1 = new CreateJsPerson("zhu1", 18);
752+ var p2 = new CreateJsPerson("zhu2", 28);
753+ p1.writeJs();//->my name is zhu1,i can write js 啦!!
754+ p2.writeJs();//->my name is zhu2,i can write js 啦!!
755+ p1.like.push("p1-like");
756+ console.log(p1.like);//["one", "two", "p1-like"]
757+ console.log(p2.like);//["one", "two"]
758+ console.log(p1.writeJs === p2.writeJs);//->true
759+ console.log(p1.like === p2.like);//->false
759760
760761
761- 在这个例子中,实例属性都是在构造函数中定义的,而由所有实例共享的属性 constructor 和方法 sayName () 则是在原型中定义的。而修改了 person1.friends (向其中添加一个新字符串),并不会影响到 person2.friends ,因为它们分别引用了不同的数组。
762+ 在这个例子中,实例属性都是在构造函数中定义的,而由所有实例共享的属性 constructor 和方法 writeJs () 则是在原型中定义的。而修改了 p1.like (向其中添加一个新字符串),并不会影响到 p2.like ,因为它们分别引用了不同的数组。
762763
763764** 这种构造函数与原型混成的模式,是目前在 ECMAScript中使用最广泛、认同度最高的一种创建自定义类型的方法。可以说,这是用来定义引用类型的一种默认模式。**
764765
765766
767+ ##### 1、构造函数模式中拥有了类和实例的概念,并且实例和实例之间是相互独立开的->实例识别
768+
769+ 基于构造函数模式的原型模式解决了方法或者属性公有的问题->把实例之间相同的属性和方法提取成公有的属性和方法 ->想让谁公有就把它放在CreateJsPerson.prototype上即可
770+
771+ - 1、每一个函数数据类型(普通函数、类)都有一个天生自带的属性: prototype (原型),并且这个属性是一个对象数据类型的值
772+ - 2、并且在prototype上浏览器天生给它加了一个属性constructor(构造函数),属性值是当前函数(类)本身
773+ - 3、每一个对象数据类型(普通的对象、实例、prototype...)也天生自带一个属性:__ proto__ ,属性值是当前实例所属类的原型(prototype)
774+
775+ function Fn() {
776+ this.x = 100;
777+ this.sum = function () {
778+ };
779+ }
780+ Fn.prototype.getX = function () {
781+ console.log(this.x);
782+ };
783+ Fn.prototype.sum = function () {
784+ };
785+ var f1 = new Fn;
786+ var f2 = new Fn;
787+ console.log(Fn.prototype.constructor === Fn);//->true
788+
789+ ##### 2、Object是JS中所有对象数据类型的基类(最顶层的类)
790+
791+ //1)、f1 instanceof Object ->true 因为f1通过__ proto__ 可以向上级查找,不管有多少级,最后总能找到Object
792+
793+ //2)、在Object.prototype上没有__ proto__ 这个属性
794+
795+ function Fn() {
796+ this.x = 100;
797+ this.sum = function () {
798+ };
799+ }
800+ Fn.prototype.getX = function () {
801+ console.log(this.x);
802+ };
803+ Fn.prototype.sum = function () {
804+ };
805+ var f1 = new Fn;
806+ var f2 = new Fn;
807+ // console.log(Fn.prototype.constructor === Fn);//->true
808+ console.log(f1 instanceof Object);//->true
809+ console.dir(f1);//->原型,原型链的查找;
810+
766811
812+ ##### 3、原型链模式
767813
768814# 知识点六:其它扩展模式
769815
0 commit comments