logo头像

桃李不言,下自成蹊

JavaScript笔记整理第2篇

关于Javascript常见创建对象的几种方式以及原型链分析

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
//1.创建构造函数
function Person(name,age,sex) {
this.name=name;
this.age=age;
this.sex=sex;
this.say=function () {
console.log('我饿了。我要吃饭');
}
}

//调用构造函数创建对象以及使用
var obj = new Person('jack',18,'男');
obj.say();
console.log(obj.name);
console.dir(obj);
console.dir(Person);

//obj.constructor 获取实例对象的构造器(构造函数)
//判断某个对象是否属于这种数据类型
console.log('obj.constructor === Person',obj.constructor === Person);

console.log('obj.__proto__.constructor === Person',obj.__proto__.constructor === Person);
console.log('obj.__proto__.constructor === Person.prototype.constructor');


//2.工厂方式创建对象
function createObject(name,age) {
var obj = new Object();
obj.name=name;
obj.age=age;
return obj;
}
//调用工厂方法
var obj1 = createObject('张三',18);
console.log(obj1);

/**
*两种方式对比
* 共同点:都是函数,都可以创建对象,都可以传入参数
*
* 区别
* 工厂模式:
* 函数名小写、
* 内部有new、
* 有返回值、
* 直接调用函数就是创建对象
* 自定义构造函数:
* 函数名大写、
* 内部无new、
* 没有返回值、
* this是当前对象
* */



//使用prototype创建原型属性与方法,实现(数据共享,节省内存)
/*方式一*/
function Student(name,age,sex) {
this.name=name;
this.age=age;
this.sex=sex;
}
Student.prototype.height=188;
Student.prototype.weight='55kg';
Student.prototype.eat=function () {
console.log(this.name+'饿了,要吃饭去');
};
Student.prototype.isWillSwiming=true;

var p1 = new Student('码云',15,'男');
p1.eat();
console.dir(Student)
console.log(p1);


/*方式二*/
function Student(name,age,sex) {
this.name=name;
this.age=age;
this.sex=sex;
}
//简写弊端:无法查看构造器指向,需手动修改
Student.prototype={
//手动修改构造器的指向
constructor:Student,
height:100,
weight:'55kg',
version:1.0,
eat:function () {
console.log('该吃饭了');
},
study:function () {
console.log('该学习了');
},
swiming:function () {
console.log('该游泳了')
}
};

var stu = new Student("刘亦菲",18,'女')
console.dir(Student)
console.dir(stu)

原型链总结
/**
* 构造函数内部有自己的原型对象(protoptype)
* 原型对象的构造器(constructor)指向自己的构造函数
* 实例对象内部有自己的原型(__proto__)指向的构造器(contructor)函数
*
*
* 实例对象先从自身寻找属性,如果找到就返回,如果没找到就从原型对象里边寻找,如果原型对象里也没有就直接报错了,整个寻找过程此时就形成了原型链
*
*
* 实例对象使用的属性或者方法,先在实例中查找,找到了则直接使用,找不到,去实例对象的_proto_指向构造函数的原型对象prototype中找,找到了则使用,找不到就报错
* 原型链:实例对象与原型对象之间的关系是通过原型(__proto__)来联系的,这种关系叫做原型链
* 实例对象与构造函数之间没有直接上的关系
* 构造函数中的this与原型对象中的this都是实例对象
*
*
* 原型???
* 实例对象中有__proto__这个属性,叫原型,也是一个对象,不是标准的属性
* 构造函数中有prototype这个属性,叫原型,也是一个对象,是标准的属性
* __proto__也可以叫原型对象
* prototype可以叫做原型对象
*
*
* 实例对象的__proto__和构造函数中的prototype相等
* 又因为实例对象是通过构造函数来创建的,构造函数中有原型对象prototype
* 实例对象的__proto__指向了构造函数的原型对象prototype
*
* */
支付宝打赏 微信打赏

您的支持是对作者最大的肯定