<!DOCTYPE html>
<html lang="en">
<body>
</body>
<script>
function print(txt) {
document.body.innerHTML += txt + '</br>';
}
</script>
<script>
var obj = {
constructor: function () {
this.name = "haha"
},
name: 'xm',
getName: function () {
return this.name;
}
};
print(Object.hasOwnProperty('getName'))//false
print(obj.hasOwnProperty("name"));//true
print(obj.hasOwnProperty('getName'))//true
print(obj.getName())//xm
print(+"10." + 1)//11
print(obj.toString())//[object Object]
print(obj.valueOf())//[object Object]
print(obj.toLocaleString())//[object Object]
var list = ['x'];
list.unshift('a', 'b');
print(list)//a,b,x
Object.defineProperty(obj, '_name', {
writable: true,
value: 'default .',
configurable: true
});
Object.defineProperty(obj, 'name', {
get: function () {
return this._name;
},
set: function (name) {
this._name = name;
},
// what:function () {
// return 'what....'
// }
});
Object.defineProperties(obj, {
age: {
writable: true,
value: '12'
},
sex: {
//value:'man',
set: function (sex) {
this._sex = sex;
},
get: function () {
return this._sex;
}
}
}
);
'use strict';
// delete obj._name
// obj.name='....'
print(obj.name)//default .
print(Object.getOwnPropertyDescriptor(obj, '_name').value);//default .
print(Object.getOwnPropertyDescriptor(obj, '_name').configurable);//true
print(Object.getOwnPropertyDescriptor(obj, 'name').what);//undefined
print(obj.age)//12
print(obj.sex)//undefined
print('------------------')
function Person(name, age) {
this.name = name;
this.age = age;
//每个实例都有自己的方法
this.getName = function () {
return this.name;
}
}
// Person("小明",10);
// print(name);
// print(age)
// print(getName());
var p = new Person('xiaoming', 11);
print(p.getName());//xiaoming
print(p.constructor === Person && new Person().constructor === Person);//true
print(p.getName === new Person().getName);//false
print('------------------');
function Student(name, age) {
this.name = name;
this.age = age;
}
//所有实例公用getName方法
Student.prototype.getName = function () {
return this.name;
};
Student.prototype.sex = 'woman';
var xiaoming = new Student('xiaoming', 15);
print(xiaoming.getName());//xiaoming
print(xiaoming.constructor === Student);//true
print(xiaoming.getName == new Student('', 0).getName);//true
var xm = new Student('xm', 11);
var xh = new Student('xh', 12);
print(xm.sex);//woman
print(xh.sex);//woman
xm.sex = 'man'; //该实例中,实例中的同名熟悉会覆盖原型中的熟悉,但不会影响另一个实例中的sex值
// 调用实例的方法或属性时,先在该实例内部查找,找不到就去原型中查找。
print(xm.sex);//man
print(xh.sex)//woman
print(xm.hasOwnProperty('sex'))//true 用于实例属性 sex
print('sex in xm ?' + ('sex' in xm));//true in用于判断对象实例能否调用某个属性,不管是在原型中还是在实例中,只要有就返回true
xm.what = '...';
print('what in xm ? ' + ('what' in xm))//true
print('what in xh ? ' + ('what' in xh))//false
print(xh.hasOwnProperty('sex'))//false 不拥有实例属性,sex是原型中的
print('sex in xh ?' + ('sex' in xh));//true
delete xm.sex;
print(xm.sex);//woman 删除了实例中的sex属性,所以再次访问时得到的是原型中定义的woman
print(xm.hasOwnProperty('sex'))//false 删除后实例中没有了sex属性,但原型中还有
print('sex in xm ?' + ('sex' in xm));//true
print('-------for in obj--------')
for(var w in xm){//除了原型中不可枚举属性外,都可以得到
print(w)
// name
// age
// what
// getName
// sex
}
print(Object.keys(Student.prototype))//getName,sex 只获取原型中可枚举的属性
print(Object.keys(xm))//name,age,what 获取实例中可枚举的属性,不包含原型中的属性
Student.prototype={ //或者这样一次定义多个原型属性
xxx:'xxx',
yyy:'yyy',
getXXX:function () {
return this.xxx;
},
getYYY:function () {
return '...'
},
getSchool:function () {
return '...'
}
}
</script>
</html>
js 实例 及 原型
最新推荐文章于 2024-08-08 16:04:51 发布