Discuss / JavaScript / JS和python比起来还要动态,没有约束有点容易写错

JS和python比起来还要动态,没有约束有点容易写错

Topic source

alienation

#1 Created at ... [Delete] [Delete and Lock User]

方法一:直接写需要传参的构造函数

function Cat(name) {
    this.name = name
}
Cat.prototype.say = function(){
return `Hello, ${this.name}!`}

方法二:写传属性和其值的封装了构造函数的函数

function Cat(prop){
    return new C(prop)
}
function C(prop){
    this.name = prop.name
}
C.prototype.say = function(){
    return `Hello, ${this.name}!`

二者区别在于后者不用显式声明new。传参的形式也不一样,前者直接传数据类型,后者传的是对象属性和对应值

都可以把方法封装在一个原型里,新的子类的实例共用原型方法

alienation

#2 Created at ... [Delete] [Delete and Lock User]

第三种创建子类

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

Reply