#hasOwnProperty和constructor的使用

hasOwnProperty 看是不是對象自身下面的屬性
```
var arr = [];
arr.num = 10;
Array.prototype.num2 = 20;
alert( arr.hasOwnProperty('num') ); // true
alert( arr.hasOwnProperty('num2') ); // false
```
constructor:查看對象的構造函數
```
function Aaa(){
}
var a1 = new Aaa();
alert( a1.constructor );
var arr = [];
alert( arr.constructor );
alert( arr.constructor == Array ); // true
```
```
function Aaa(){
}
// Aaa.prototype.constructor = Aaa; // 這句話是系統自動生成的,也是由系統生成的唯一的一句話
var a1 = new Aaa();
alert(a1.constructor);
```
```
function Aaa(){
}
// Aaa.prototype.constructor = Aaa; // 每一個函數都會有的,都是系統自動生成的
Aaa.prototype.constructor = Array; // 可以把它覆蓋掉
var a1 = new Aaa();
alert(a1.constructor);
```
系統只會自動生成一個constructor,那hasOwnProperty又是從哪里來的呢
```
function Aaa(){
}
var a1 = new Aaa();
alert(a1.hasOwnProperty == Object.prototype.hasOwnProperty); // true
```
這說明a1.hasOwnProperty中的hasOwnProperty方法是在Object對象下面的
有時候我們會在不經意間就把constructor改掉了
```
function Aaa(){
}
Aaa.prototype.name = 'zhangsan';
Aaa.prototype.age = 20;
var a1 = new Aaa();
alert( a1.constructor );
```
轉換成簡寫形式
```
function Aaa(){
}
Aaa.prototype = {
name: 'zhangsan',
age: 20
};
var a1 = new Aaa();
alert( a1.constructor );
```
上面這種寫法就會把constructor改掉。如果想要使用簡寫形式,需要修正constructor的指向
```
function Aaa(){
}
Aaa.prototype = {
constructor: Aaa,
name: 'zhangsan',
age: 20
};
var a1 = new Aaa();
alert( a1.constructor );
```
系統自動生成的屬性 for in 是找不到的
```
function Aaa(){
}
for(var attr in Aaa.prototype){
alert(attr);
}
```
重寫系統自動生成的屬性 for in 同樣找不到
```
function Aaa(){
}
Aaa.prototype.constructor = Aaa;
for(var attr in Aaa.prototype){
alert(attr);
}
```
非系統自動生成的屬性 for in 可以找到
```
function Aaa(){
}
Aaa.prototype.name = 'zhangsan';
for(var attr in Aaa.prototype){
alert(attr); // zhangsan
}
```
- 01 JS面向對象及組件開發
- 02 傳統的過程式編寫選項卡
- 03 用面向對象封裝通用選項卡
- 04 控制多個選項卡自動播放
- 05 用面向對象編寫拖拽
- 06 JS面向對象及組件開發
- 07 hasOwnProperty和constructor的使用
- 08 instanceof運算符的使用
- 09 利用toString做類型判斷
- 10 什么是面向對象的繼承
- 11 面向對象之拷貝繼承
- 12 編寫繼承的拖拽
- 13 繼承的其他形式之類式繼承
- 14 繼承的其他形式之原型繼承
- 15 組件開發是什么
- 16 給拖拽組件配置不同參數
- 17 封裝彈框組件
- 18 使用對象標記已彈出彈框
- 19 復雜組件開發之自定義事件
- 20 原生JS實現自定義事件
- 21 自定義事件實例
- 22 基于JQ的選項卡組件開發