此刻想法:
    接触前端开发两年了,虽然实际工作中编写代码没有问题,但是对于前端的一些基础知识点掌握得的确不牢固,
每一次仔细琢磨一个知识点,都会有新的领悟。就从这篇文章开始,记录自己的前端学习历程。

重点

1、js所有引用数据类型本质都是对象。
2、对象分为普通对象和函数对象。
3、所有对象都有_proto_属性,指向其构造函数的prototype属性。
4、只有函数对象有prototype属性。

代码示例

function Person(name,age){
    this.name = name;
    this.age = age;
}

Person.prototype.alertName = function(){
    alert(this.name);
}

var p1 = new Person('张三','18');

p1.alertAge = function(){
    alert(this.age);
}

var p2 = new Person('李四','20');

p2.alertAge = function(){
    alert(this.age);
}

clipboard.png

知识点总结:

1、new 操作符具体干了什么?

(1)新建一个空对象 
    var obj = {};
(2)将Person的protoype属性赋值给obj的_proto_属性
    obj._proto = Person.prototype;
(3)将Person的this指向obj,并执行Person函数
    Person.call(obj);
(4)返回obj
    return obj;

2、构造函数一般首字母大写,用以区分普通的函数。

3、通过把要实现的方法alertName,赋值给构造函数Person的prototype属性,实现了实例p1、p2共享此方法。实现了继承的功能,达到了节省内存的目的。

4、当试图得到一个对象的某个属性时,如果这个对象本身没有该属性,那么会去它的_proto_中寻找。一直往上寻找,就形成了原型链。一直找到最上层,没有则宣告失败,返回undefined。最上层是Object.prototype._proto_值为null。

p1._proto_指向Person.prototype,Person.prototype._proto_指向Object.prototype,
Object.prototype._proto_等于null。

5、函数的prototype属性中的_proto_属性和普通对象的_proto_属性一样,用来对应继承关系。


icey
48 声望0 粉丝