面向对象
面向对象是思想的变化,而不是代码的语法。
构造函数
构造函数与普通函数的区别是首字母要大写,调用方式不同。在函数内部要通过this给实例添加属性。方法要添加在原型上。
初始化构造函数时
开辟内存空间
与this绑定
执行函数体中的代码
悄悄地返回this
构造函数中的return
如果返回的是值类型 忽略return
如果返回的是引用类型 则以return为准
原型
原型是一种机制,允许构造函数的实例调用原型上的内容。
原型具体来说是函数的属性,叫prototype
原型查找机制
当实例调用一个属性或者方法时,会先查找自身,如果查询不到就会去查找构造函数的原型。
安全类
是一种设计模式 为了解决构造函数不被new调用的情况
instanceof
该关键字用于检测 对象是否是函数的实例
console.log([] instanceof Array); // true
console.log({} instanceof Array); // false
注: 所有函数都是Function的实例 所有对象都是Object的实例 函数也是对象
判定是否是自身属性
ES5中有一个方法,叫做hasOwnProperty 该方法可以判定对象的属性和方法是否属于对象自身。
// 定义类
var Dog = function(name, age) {
this.name = name;
this.age = age;
}
Dog.prototype.sayHello = function() {
}
Dog.prototype.num = 10;
var d = new Dog("小白", 13);
console.log(d.name);
console.log(d.age);
console.log(d.num);
console.log(d.hasOwnProperty("name")); // 检测name是否是d的自身属性
console.log(d.hasOwnProperty("age")); // 检测age是否是d的自身属性
console.log(d.hasOwnProperty("num")); // 检测num是否是d的自身属性
## 总结:
1、所有的函数都有Prototype属性和__proto__属性,实例对象没有prototype属性。函数才有。
2、prototype属性本质上也是对象(实际上就是Object的实例对象--{} 或者new Object)--原型对象中也有一个__proto__属性,并且指向Object.prototype,但是Object.prototype中没有该属性,指向null。
3、原型对象默认会有一个构造器construction属性,该属性指向原型所属的构造函数,
4、所有的函数都是Function的实例
5、Function也是自己的实例
6、所有的实例对象中,都有一个__proto__ 属性,该属性指向创建该实例对象的构造函数的原型。
7、__proto__属性不可以在编程中使用,该属性不是标准,只能在浏览器自己内部使用。
8、虽然所有的函数中都有prototype和__proto__俩个属性,但是这俩个属性不是在所有的情况下都有用,
prototype只有在实例化之后才有价值 new Foo()
__proto_只有作为普通函数才有价值, foo.call()
9、实例对象中也有__proto__,主要和函数中的__proto__ 做好区分,实例对象指的是自己构造函数的原型,函数中的__proto__也是指向构造函数的原型,但是特指Function的原型。