- 对象最常见的用法是:
1:创建
2:设置
3:查找
4:删除
5:检测
- 创建对象
inherit()函数:
防止库函数无意间(非恶意的)修改那些不受你控制的对象。不是将对象直接作为参数传入函数,而是将它的继承对象传入函数。当函数读取几成对象的属性时,实际上读取的是继承来的值。如果给继承对象的属性赋值,则这些属性只会影响这个继承对象自身,而不是原始对象。
// 返回一个继承自原型对象proto的属性的新对象
// 这里可以用到ES5的Object.create()函数
function inherit(proto) {
if(proto == null) throw TypeError();//proto是一个对象,但不能是null
if(Object.create) return Object.create(proto); //如果Object.create()存在,使用它
var t = typeof proto; //否则进一步检查
if(t!=='object' && t!=='function') throw TypeError();
var F = function() {}; // 定义一个空构造函数
F.prototype = proto; // 将其原型属性设置为proto
return new F(); // 使用F()创建proto的继承对象
}
var o = {x:"don't change this value"};
libary_function(inherit(o)); //防止对o的意外修改
问题:
在关于下面的这句判断时,一时无法理解
代码如下:
var t = typeof proto; //否则进一步检查
if(t!=='object' && t!=='function') throw TypeError();
我们的印象中原型对象应该是个Object或者直接是字面量,那么传递的参数类型会有“function”类型情况吗?
理解:
函数也是对象,也可以有自己的属性和方法。等等,这不是我们的静态属性和方法啊!这里是指把函数看成可以添加属性的对象
// 测试传递function类型
var func = function() {};
func.text = 'good work';
func.getText = function() {
return func.text;
};
console.log(typeof func); // 'function'
// 传递function类型,返回以func为原型的新对象
var subFunc = inherit(func);
console.log(subFunc.getText()); // 输出:'good work'
一个证明说明,原来是可以传递’function’类型的!