>웹 프론트엔드 >JS 튜토리얼 >JS는 객체를 생성합니다(공통 메소드)_js 객체지향

JS는 객체를 생성합니다(공통 메소드)_js 객체지향

WBOY
WBOY원래의
2016-05-16 18:58:59890검색

贴个代码先:
function O(user,pwd){ //생성자 사용
this.user=user;
this.pwd=pwd;
this.get=get;
이것을 돌려주세요;
}
function O2(user,pwd){ //팩토리 사용
var obj=new Object();
obj.user=사용자;
obj.pwd=pwd;
obj.get=get;
obj를 반환합니다.
}
함수 O3(){ //프로토타입 사용
}
O3.prototype.user='abc';
O3.prototype.pwd='dis';
// O3.propotype.get='get';
//O3.prototype.get(){
//alert(this.pwd);
//}
함수 O4(사용자,비밀번호){
this.user=user;
this.pwd=pwd;
이것을 돌려주세요;
}
O4.prototype.get=function(){alert('123');}

//function get(){
//alert("이 사용자:" this.user);
// }
function test2(){
//var a=new O2('Us','Pw'); 팩토리 및 생성자 사용
//var a=new O3(); //프로토타입 사용
//a.get();
var a=new O4('*U4','P4'); //합치기
//a.user='ABC가 아닙니다'; //새 속성 설정
//alert(a.user);
a.get();
}
常用的MS 就这几种,可能还有其它的.碰到再说吧....
题外话:昨天手欠,试图用alert(window.appName)到ffの下去查看浏览器版本,结果弹是Netscape, 咋不是firefox.继而又跑去chrome下试验, 又一次弹了Netscape。baidu搜 Netscape 竟然发现js就출자Netscape공주。惭愧啊惭愧!!研究了这么久的jstour不认识祖师爷。于是又跑去找了找族谱,원라来jstake自Brendan Eich 75年他创造js时候,也不过就31岁。哎呀,真是白活了,如他一般老的我,到现는 duc공부하고 있지 않습니다 js,真是人比人气死人。戏,电话于一身的智能机。真是造化弄人!!复杂적js.
js不是木有类么?没关系,人家不是设计了原型属性么~
js不是木有块级 창작域么?没关系,人家不是유작용域链么~
js怎样实现成员变weight私유화?哦,用闭包解决吧~
哦,这么多基本概念,彻底的晕掉了,路漫漫其修远兮。
言归正传,本文讨论几种js创建对象적 방법,先从最好理解的工厂模式开始:

复aze代码 代码如下:

function createPerson(name,age) ,job){
var o = {};
o.name = 이름;
o.age = 나이;
o.job = 직업;
o.sayName = function(){
alert(this.name);
};
반품 오;
}
var tanya = createPerson("tanya","30","female");
var ansel = createPerson("ansel","30","남성");
tanya.sayName();
ansel.sayName();

이는 为一个공중의 상태를 결정하는 것입니다.这样写也是괜찮습니다.
复aze代码 代码如下:

function createPerson(이름, 나이, 직업){
var o = {
이름 : 이름,
나이 : 나이,
직업 : 직업,
sayName : function(){
alert(this.name);
}
};
반품 오;
}
var tanya = createPerson("tanya","30","female");
var ansel = createPerson("ansel","30","남성");
tanya.sayName();
ansel.sayName();

이것이 因为this就表示当前运行时的对象,将构造函数이작용域指向new对象,将当前运行对象의 효능과 방법给new对象,这样对象模式称为构造函数模式
复主代码 代码如下:

function Person(이름,나이,직업){
this.name = 이름;
this.age = 나이;
this.job = 직업;
this.sayName = function(){
alert(this.name);
};
}
var tanya = new Person("타냐","30","여성");
var ansel = new Person("ansel","30","남성");
tanya.sayName();
ansel.sayName();

지금 这个例子中,tanyawaanseltour有一个constructor属性,该属性指向person.
考虑一下如下的情况:
复主代码 代码如下:

함수 사람(이름,나이,직업){
this.name = 이름;
this.age = 나이
this.job = job; function(){
alert(this.name);
}
Person("tanya","30","female")
Person("ansel", "30","male");
window.sayName();
window.sayName()


두 ansel이 모두 나타나는 것을 발견했습니다. 이는 new가 아니기 때문입니다. 사용되는 경우에는 사람의 인스턴스가 아니고 기능만 실행하는 것입니다. 전역 범위에서 함수를 호출할 때 이는 항상 Global 객체를 가리킵니다. Global 개체는 브라우저의 창 개체입니다.
구성 모드를 사용하여 다른 개체에서 sayName 메서드를 호출할 수도 있습니다. 다른 상황을 고려해 보겠습니다.


코드 복사
코드는 다음과 같습니다. function Person(name,age,job){ this.name = name; this.job = job;
this.sayName = function(){
alert(this.name);
}
var olivia =
Person. call(olivia,"tanya","30","female");
olivia.sayName()
var philip = {}
Person.apply(philip,["ansel" ,"30 ","male"]);
philip.sayName();


프로토타입 모드에서는 프로토타입 체인을 고려해야 합니다. 분석 후 sayName 메소드는 인스턴스에서 반복적으로 정의됩니다. 두 번이지만 두 개의 동일한 복사본을 만들 필요가 없습니다. 프로토타입 메소드를 사용하여 tanya와 ansel은 sayName 메소드를 공유할 수 있습니다.
그래서 프로토타입 패턴은 다음과 같이 작성됩니다.



코드를 복사하세요


코드는 다음과 같습니다.
함수 사람(이름,나이,직업){ this.name = 이름; this.age = 나이 this.job = 직업; 프로토타입.sayName= function( ){ alert(this.name);
var tanya = new Person("tanya","30","female")
var ansel = new Person("ansel ","30","male");
tanya.sayName();
ansel.sayName()


실제 애플리케이션에서는 패턴이 항상 적용되는 것은 아닙니다. 메소드를 공유해야 할 때는 프로토타입 모드를 사용하고, 복사본을 사용해야 할 때는 생성 모드를 사용하며, 이들을 결합하여 생성자에 모든 정보를 캡슐화하고, 객체를 동시에 사용할 수 있도록 생성자에서 프로토타입을 초기화할 수도 있습니다. 생성자와 프로토타입의 장점




코드 복사


코드는 다음과 같습니다.


함수 Person(이름,나이,직업) { }
}
var tanya = new Person("tanya","30","female");
var ansel = new Person("ansel","30","male");
ansel.sayName = function () {
alert("안셀, 정말 멋져요!");
}
tanya.sayName()
ansel.sayName()

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.