函数:
因为函数属于引用类型,有属性和方法。而且函数属于一种特殊的对象继承自obj,函数名其实就是一个指向函数对象的指针。
所以当重复定义了两次函数之后,第二次定义的函数会将函数指针指向第二个被实例化的函数对象
理解一下重载:
重载就是给函数设置不同的参数个数和类型,通过控制传参来调用不同的方法。
但是js有形参和实参的机制,所以重载是不存在的,但是可以通过使用函数内部属性(arguments)来控制
arguments代表的是实参合并成数组的形式 arguments[0]//表示传递的第一个元素 arguments[1]//表示传递的第二个元素
所以可以通过判断arguments的长度来控制函数内部执行不同的方法达到变相的重载效果。
arguments这个对象还有一个属性:callee,该属性是一个指针,指向拥有arguments对象的函数。不太理解这个。。下次看到补上
对象:
关于对象内属性调用,可以打点调用obj.name;也可以用括号,用括号可以写变量obj[name]
js 的每一个实例都具有以下属性和方法:
constructor
保存着用于创建当前对象的函数,对于前面的例子,构造函数就是object()
hasOwnProperty(propertyName)
检查当前属性在当前对象实例中,而不是在原型中是否存在。参数以字符串的形式。就是检查当前属性是否是对象专属的,而不是通过原型继承过来的.
isPrototypeOf(object)
检查传入对象是否是传入对象的原型
propertyIsEnumerable(propertyName)
用来检查给定的属性是否是枚举类型。能被for...in遍历出来的属性;未经由Object.defineProperty定义为不可列举。但是可以通过Object.defineProperty(obj, 'toString', {value: ..., enumerable: false})去设置某属性为不可枚举的
toLocaleString()
返回对象的字符串表示
person.toString()
返回对象的字符串表示
valueOf()返回对象的字符串表示
Object.create()创建
该方法有两个参数,我就只解释下第一参数,第二个参数不常用(对对象的属性进行进一步描述)
第一个参数:传入要继承的原型(prototype)对象
怎样理解这句话呢?
var obj1 = Object.create({
name: "ys",
age: 12
});
console.log(obj1); //{}
console.log(obj1.age); //12
所以创建一个空对象:
varobj3 = Object.create(Object.prototype);
console.log(obj3); //{},(空对象,与前两个方法 {},new Object 相同)
console.log(obj3.__proto__); //如下图 ,只包含了基本对象的方法
如果是一个对象需要至空,那就直接obj=null;