2.3 KiB
2.3 KiB
20191221
- 原型的作用
- 数据共享
- 节省内存
- 实现继承 ----> 数据共享
- 通过原型进行继承
- 缺陷:因为改变原型指向实现继承,必须同时进行初始化赋值,所以导致属性重复,如果想改变属性,只有通过调用对象属性重新赋值
function Person(name) {
this.name = name
}
Person.prototype.eat = function() {
console.log('真好吃')
}
// 创建学生对象
function Student(score) {
this.score = score
}
Student.prototype = new Person('张三')
Student.prototype.play = function() {
console.log('每天都在写代码')
}
var st1 = new Student(100)
console.log(st1.name)
console.log(st1.eat)
console.log(st1.play)
组合继承
- 改变原型对象的指向但是不进行初始化
- 解决了属性重复赋值,共享方法
function Student(name, score) {
Person.call(this.name)
this.score = score
}
Student.prototype = new Person() // 不传参数
Student.prototype.play = function() {
console.log('考试真是太有意思了')
}
var str1 = new Student('张三',100)
console.log(st1.name, st1.score)
拷贝继承
// 字面量创建对象
var obj1 = {
name: '张三',
age: 18,
eat: function() {
console.log('午饭没吃')
}
}
// 改变了指向,对象之间传值,其实是改变了引用,也叫指针
var obj2 = obj1
console.log(obj2.name)
var obj2 = {}
for(var key in obj1) {
obj2[key] = obj1[key]
}
function Person() {
}
Person.prototype.name = '李四'
Person.prototype.age = 18
Person.prototype.eat = function() {
console.log('eat')
}
for( var key in Person.prototype) {
obj3[key] = Person.prototype[key]
}
console.log(p.name)
函数的声明
- 推荐使用函数表达式,函数声明在嵌套表达式中在ie8中会出现问题(后边覆盖前面的)
var fn = function() {}
var fn = () => {}
this指向
- 普通函数的this指向window
- 严格模式下,普通函数this指向调用者
- 对象方法的this指向 实例对象
- 定时器this指向 window
- 构造函数this指向 实例对象
- 原型方法的this指向 实例对象
- 对象中有__proto__
- 函数中有prototype 也是对象
- 函数中有prototype 对象也有__proto__ 是一个实例对象
- 任何函数都是Function的实例对象