js基础(原型)
?
function fun(){alert(this.name); }; function Person(name , age , gender){this.name = name;this.age = age;this.gender = gender;//向?qū)ο笾刑砑右粋€方法this.sayName = fun;}//每次創(chuàng)建對象都會新建一個sayName方法,而且是不一樣的,這樣完全沒有必要,可以所有的對象共享同一個方法
//將sayName方法定義在全局中,污染了全局的作用域的命名空間,而且定義在全局作用域中也不安全
?
?
我們創(chuàng)建的每一個函數(shù),解析器都會向函數(shù)添加一個屬性prototype,這個屬性對應(yīng)一個對象,這個對象就是我們的原型對象
如果函數(shù)作為普通函數(shù)調(diào)用prototype沒有任何作用,當(dāng)函數(shù)以構(gòu)造函數(shù)的形式調(diào)用,它所創(chuàng)建的對象都會有一個隱含的屬性,指向該構(gòu)造函數(shù)的原型對象,可以通過__proto__來訪問屬性
原型對象就相當(dāng)于一個公共區(qū)域,所有同一個類的實例都可以訪問這個原型對象,我們可以將對象中公共的內(nèi)容設(shè)置到原型對象中
當(dāng)我們訪問對象的一個屬性或者方法時候,它會在對象自身中尋找,如果有則直接使用,如果沒有,則會去原型對象中尋找,如果找到則使用
創(chuàng)建構(gòu)造函數(shù)時候,可以將這些對象共有的屬性或者方法,統(tǒng)一添加到構(gòu)造函數(shù)的原型對象中,使每個對象都具有這些屬性和方法
function Person(name , age , gender){this.name = name;this.age = age;this.gender = gender;//向?qū)ο笾刑砑右粋€方法//this.sayName = fun; }var person = new Person(); console.log(person.__proto__); //{constructor: ?} console.log(Person.prototype); //{constructor: ?} console.log(person.__proto__ == Person.prototype); //true // person.sayName();//報錯 Person.prototype.sayName = function (argument) {alert("success"); }var obj = new Person(); //obj.sayName(); console.log(obj); console.log("sayName" in obj);//true console.log(obj.hasOwnProperty("name"));//true console.log(obj.hasOwnProperty("hasOwnProperty"));//false console.log(obj.__proto__.hasOwnProperty("hasOwnProperty"));//false console.log(obj.__proto__.__proto__.hasOwnProperty("hasOwnProperty"));//true原型對象也是對象,所以它也有原型
當(dāng)我們使用一個對象的屬性或者方法的時候,會在自身中尋找,如果沒有則去原型中尋找,如果沒有則到原型的原型去尋找,直到Object對象,則返回undefined
?
當(dāng)直接在頁面打印一個對象時候,實際上輸出的是該對象的toString()方法的返回值,可以添加一個toString()
function Person(name, age) {// body...this.name = name;this.age = age;}Person.prototype.toString = function(){return "Person[name='"+this.name+", age = "+this.age+"']";}var person = new Person("Tom", 78);person.toString = function(argument) {return this.name + "====" + this.age;}console.log(person);console.log(new Person());?
垃圾回收:
當(dāng)一個對象沒有任何的變量或者屬性對它進(jìn)行引用的時候,此時我們將無法操作該對象,此時的對象就是一個垃圾
js中有自動的垃圾回收機(jī)制,會自動將這些垃圾進(jìn)行銷毀,因此我們不需要進(jìn)行垃圾回收,我們要做的就是將不再使用的對象賦值為null
??
?
? ??
轉(zhuǎn)載于:https://www.cnblogs.com/lzb0803/p/9016764.html
總結(jié)
- 上一篇: Jenkins搭建Nodejs自动化测试
- 下一篇: SQL简单基础