1.对构造函数的优化
第一种:对构造函数优化的方法
<script>
function study(){
console.log("我爱学习");
}
function Eat() {
console.log("吃饭");
}
//第一种:对构造函数进行优化
function Student(stuid, stuname) {
this.stuid = stuid
this.stuname = stuname
this.study = study
this.Eat = Eat
}
//实例化一个对象,使用new来实例化
var stu_1 = new Student("1001", "张三")
stu_1.study()
stu_1.Eat()
</script>
第二种:对构造函数优化的方法
<script>
var fns = {
study: function () {
console.log("我爱学习");
},
Eat: function () {
console.log("吃饭");
}
}
//第二种:对构造函数进行优化
function Student(stuid, stuname) {
this.stuid = stuid
this.stuname = stuname
this.study = fns.study
this.Eat = fns.Eat
}
//实例化一个对象,使用new来实例化
var stu_1 = new Student("1001", "张三")
stu_1.study()
stu_1.Eat()
</script>
2.原型prototype
使用原型时,一般情况下,对象的属性不会放在原型上创建,会直接放在构造函数中,除非这个属性的值是共享的数据,此时就可以放在原型上;一般需要共享的函数也可以放在原型上,这样的话,每个实例化的对象中都包含了此函数
构造函数、原型对象和实例化对象三者之间的关系
构造函数创建时会自动添加一个prototype原型对象,prototype又可以通过constructor来重新指向该构造函数
构造函数可以通过new实例化一个对象,此时会添加一个隐式原型_proto_,那么该对象就可以通过对象._proto_.constructor重新指向该构造函数
实例化对象可以通过隐式原型__proto_指向prototype原型对象
console.log(Student.prototype);
Student.prototype.age = 20 //给原型prototype中创建一个属性age
Student.prototype.running = function () {//给原型prototype中创建一个属性running
console.log("跑步");
}
console.log(stu_1.age);
console.log(Student.prototype);
stu_1.running()
console.log(stu_1.age);
console.log(Student.prototype);
// 通过Student的原型对象中的constructor,可以重新指向Student
console.log(Student.prototype.constructor === Student);
//通过实例化对象时会创建一个隐式原型__proto__,它指向的就是Student.prototype
console.log(stu_1.__proto__ === Student.prototype);
//通过实例化对象的隐式原型__proto__中的constructor就可以指向Student
console.log(stu_1.__proto__.constructor === Student);
3.原型链
访问一个对象的属性时
先在自身属性中查找,找到返回
如果没有,再沿着_proto_这条链上查找,找到返回
如果最终没有找到,返回undefined
别名:隐式原型链
作用:查找对象的属性(方法)
stu_1.age=30
console.log(stu_1.age);
hasOwnProperty:检查对象本身是否包含某个属性,
如果有则返回true,反之则返回false
console.log(stu_1.hasOwnProperty("age")); //false
console.log(stu_1.__proto__.hasOwnProperty("age")); //true
in:检查对象中是否包含某个属性,如果对象本身没有,
但原型对象上有,也可以返回true
console.log("age" in stu_1); //true */
// 练习 原型链
//现由一个构造函数Student
function Person(name,sex){
this.name = name
this.sex = sex
}
var p0 =new Person("zhangsan","男")
// p0.age = 20
// Person.prototype.age = 30
console.log(p0.age); //打印出20,打印出30,打印出undefined
console.log(p0.__proto__ === Person.prototype); //打印为true
console.log(p0.__proto__.constructor == Person); //打印为true
console.log(Person.prototype.constructor ==Person); //打印为true
console.log(Person.prototype.__proto__ === Object.prototype); //打印为true
console.log(Object.prototype.__proto__); //打印为null