对
js中的函数也是对象 (即 (function(){}) instanceof Object == true)
所有的对象都有自己的构筑函数
所有的函数都能当作构筑函数, 每个函数都有一个prototype属性
每个对象都有一个隐藏的o.__proto__属性指向它的构筑函数的prototype
于是所有的函数的原型都是Function.prototype (即 (function(){}).__proto__ === Function.prototype)
访问一个对象的属性时, 如果从这个对象里找不到, 就从obj.__proto__里找, 再找不到就继续从obj.__proto__.__proto__里找, 最终会到达Object.prototype
老师用的是组合继承,Person是父类,Student是子类,在student里用person.call(this,参数),是构造函数式继承的精髓,由于call方法可以更改函数的作用环境,相当于此时student继承了person的所有属性。student.prototype=object.creat(person.prototype);
student.prototype.constructor=student;
我认为这两句话是类氏继承,作用等于student.prototype=new person();就是说实例化父类创建一个新的对象,这个对象的__proro__指向父类.prototype,这样就拥有父类的所有属性,然后把这个对象赋值给student的原型对象,这样student就继承了person的所有属性。
不过这样写的缺点在于,构造函数继承时执行了一遍父类的构造函数,实现子类原型继承的类氏继承时又调用了一遍父类构造函数。
两个是完全不同的意思,stuent.prototype=object.create(person.prototype)意思是创建一个空对象,并且原型链指向person.prototype,而student=new person();是实例化person对象,并且存放在student
是的 有上下两本 比较厚
不能说所有。Object.create(null);创建的对象,指向的原型就是null,而不是Object.prototype对象
只是让Student继承Person,让其拥有Person的方法,同时又拥有自己的私有方法。直接new Person(),将不会拥有Student里面的方法,如Student.learn()
对象字面量定义的对象指向的就是Object,所以直接使用__proto__就可以从Object.prototype上获取。而函数定义的是返回function,function需要在Object的原型链上查找
这里用call是为了使用student中的2个参数name,和age来调用构造函数里的name和age,用call调用student里就不用在写this.name=name,this.age=age了,如果还不懂的话你就上网查call和apply和bind的用法。
是不是,object.create(person.prototype) 只继承了 他的原型链
Person.prototype.constructor指向Person。
实例查找属性或方法会先从构造函数开始查,所以如果Person有一个name属性且Person.prototype也有一个name属性,通过实例.name返回的是Person上的name属性
function a(){this.name="aaa"}
//undefined
a.prototype.name="ccc"
//"ccc"
var b=new a()
//undefined
b.name
//"aaa"
a.prototype.name
//"ccc"
嗯嗯,非常感谢,看到Object.create(X) X就是作为新创建对象的原型!
看到这里就理解了。
构造器,每次new时都会调用构造器.构造器一般用于变量如年龄和姓名.
属性:而常量人基本2双手,2只交是共同特征,因此为常量,作为属性.
person.__proto__,两个_哦
那个只是给数据交互的一个标识点
一个是foo函数的原型,它应该等于Function.prototype
一个是foo函数的原型的原型,它应该等于Object.prototype
没动的话,原型相关的视频再好好看看
我个人认为空对象就是将其指针地址指向一个内容为null的地址。也就是c中的空指针,不知道这样你能不能理解。
Java是面向对象
JS是基于对象
两者本来就有区别
retina Macbook 15'