Discuss
/
JavaScript
/
JS和python比起来还要动态,没有约束有点容易写错
JS和python比起来还要动态,没有约束有点容易写错
Topic source第三种创建子类
var Cat = {
name:'kitty',
say:function(){
return `Hello, ${this.name}`
}
}
function CreateCat(name){
var s = Object.create(Cat)
s.name = name
return s
}
var dog = CreateCat('dog')
console.log(dog.say())
var bird = CreateCat('bird')
console.log(bird.say===dog.say)
function Student(name,height){
this.name = name
this.height = height
}
var robot = new Student('robot',200)
robot.weight = 50
console.log(Student.prototype)
console.log(Cat.prototype)
console.log(robot,robot.__proto__)
console.log(dog,dog.__proto__)
和构造函数创建子类相比的区别在于继承链中少了一个constructor,原型对象也没有prototype属性,(但是子类调用__proto__可以追溯到该原型对象,构造函数追溯到的是constructor)子类方法直接从原型对象的方法里继承,如果在object.create()中增加了某个属性
即使原型没有该属性,也会加在子类上,但是如果用构造函数的方法,即使传了多余的属性值对,由于函数里没有定义该属性,所以会报错,即构造函数创建对象只能完全拟合属性(创建了子类对象后可以再单独定义)
而从对象创建则可以在创建时随便增加属性
另只要是原型对象拥有的方法,子类从该对象继承后的方法都是同一个方法
而构造函数创建的对象,必须把方法放在prototype的属性之下,若放在构造函数里面,则针对每个创建的对象创建一个单独的同名方法
- 1
alienation
方法一:直接写需要传参的构造函数
方法二:写传属性和其值的封装了构造函数的函数
二者区别在于后者不用显式声明new。传参的形式也不一样,前者直接传数据类型,后者传的是对象属性和对应值
都可以把方法封装在一个原型里,新的子类的实例共用原型方法