对象(二)
1、Object.getPrototypeOf() : 根据实例对象获得原型对象
function Person() { } Person.prototype.name = "张三"; Person.prototype.age = 26; Person.prototype.sayName = function () { alert("我是公共的 name 属性"); } var p1 = new Person(); alert(Object.getPrototypeOf(p1) == Person.prototype ) // true
2、每次代码读取对象的一个属性的时候,首先在实例对象的属性中搜索是否有要找的属性,如果有,则取该属性值,如果没有,则去该对象对应的原型对象中查找该属性,如果有则返回该属性值,如果没有则返回 undefined
function Person() { } Person.prototype.name = "张三"; Person.prototype.age = 26; Person.prototype.sayName = function () { alert("我是公共的 name 属性"); } var p2 = new Person() p2.name = "赵武"; alert(p2.name) // 赵武 delete p2.name; alert(p2.name) // 张三 // 如果需要访问原型上的 name 属性,将 实例对象上的属性删除 ,则可以直接访问 原型上的 name 属性
3、hasOwnProperty 判断一个 对象属性是属于 实例属性 还是属于 原型属性
function Person() { } Person.prototype.name = "张三"; Person.prototype.age = 26; Person.prototype.sayName = function () { alert("我是公共的 name 属性"); } var p3 = new Person() alert(p3.hasOwnProperty("name")) // false p3.name = "aaa"; alert(p3.hasOwnProperty("name")); // true
4、in 操作符
判断属性是否存在于实例对象和原型对象中
function Person() { } Person.prototype.name = "张三"; Person.prototype.age = 26; Person.prototype.sayName = function () { alert("我是公共的 name 属性"); } var p4 = new Person(); alert('name' in p4); // true p4.name = "aaa"; alert('name' in p4); // true
5、利用 in 操作符 和 hasOwnPrototype 函数来 判断 属性是否是 原型的
function Person() { } Person.prototype.name = "张三"; Person.prototype.age = 26; Person.prototype.sayName = function () { alert("我是公共的 name 属性"); } var p4 = new Person(); function checkOwnPrototype(attr,obj) { return (attr in obj) && (!obj.hasOwnProperty(attr)) } alert(checkOwnPrototype("name",p4)) // true p4.name = "aaa"; alert(checkOwnPrototype("name",p4)) // false
6、Object.keys() 拿到当前对象里所有的 keys ,返回一个数组
function Person() { } Person.prototype.name = "张三"; Person.prototype.age = 26; Person.prototype.sayName = function () { alert("我是公共的 name 属性"); } // Object.keys() 拿到当前对象里所有的 keys ,返回一个数组 var p6 = new Person(); p6.name = "aaa" var arr = Object.keys(p6) alert(arr) // name alert(Object.keys(Person.prototype)) // name,age,sayName
7、Object.getOwnPropertyNames 枚举对象的所有属性 ,包括可枚举属性和不可枚举属性
function Person() { } Person.prototype.name = "张三"; Person.prototype.age = 26; Person.prototype.sayName = function () { alert("我是公共的 name 属性"); } // Object.getOwnPropertyNames 枚举对象的所有属性 ,包括可枚举属性和不可枚举属性 // constructor 是不可枚举的属性 var attributes = Object.getOwnPropertyNames(Person.prototype) alert(attributes) // constructor,name,age,sayName