OO javascript

Κώδικας, πληροφορίες, ερωτήσεις και απαντήσεις σχετικές με την JavaScript.

Συντονιστές: WebDev Moderators, Super-Moderators

Απάντηση
Άβαταρ μέλους
cherouvim
Script Master
Δημοσιεύσεις: 3137
Εγγραφή: 13 Ιούλ 2005 22:56
Τοποθεσία: Athens, Greece
Επικοινωνία:

OO javascript

Δημοσίευση από cherouvim » 30 Οκτ 2005 09:14

Pios einai o sostos kai cross browser tropos na orizoume kai na dimiourgoume objects stin JS?

Κώδικας: Επιλογή όλων

var foo = [];
foo.bar1=4;
foo.bar2=5;
foo.bar3=6;
foo.bar4=7;
foo.bar5 = function(){
	alert("i am a foo");
}
foo.push(123);
foo.push(456);
	
window.onload=function() {
	alert(foo.length);
	foo.bar5();
}
Ti simainei var foo = [];? Array i Object? An den to kano afto i .push argotera den doulevei opos episis kai i dilosi tis function .bar5

Vrika kai afto to tropo:

Κώδικας: Επιλογή όλων

var person = new Object();
person = function(){
	this.age = 20;
}
person.prototype = {
	setAge: function(age) {
		this.age = age;
	},

	getAge: function() {
		alert(this.age);
	}
}

window.onload=function() {
	var p = new person();
	p.setAge(24);
	p.getAge();
}
Einai pio sostos? Paizei pantou?

thanks

Άβαταρ μέλους
skeftomilos
Script Master
Δημοσιεύσεις: 2888
Εγγραφή: 07 Ιαν 2005 07:22
Τοποθεσία: Αθήνα

OO javascript

Δημοσίευση από skeftomilos » 01 Νοέμ 2005 02:31

Ουπς! Μου ξέφυγε και δεν το είδα εγκαίρως, σόρρυ! :)

Οι δύο παρακάτω εντολές είναι απολύτως ισοδύναμες:

Κώδικας: Επιλογή όλων

var foo = []
var foo = new Array()
Το ίδιο και οι δύο παρακάτω. Είναι ισοδύναμες μεταξύ τους:

Κώδικας: Επιλογή όλων

var foo = {}
var foo = new Object()
Με αυτό τον τρόπο παίρνουμε ένα εντελώς στοιχειώδες αντικείμενο, χωρίς κανένα member, και με prorotype επίσης χωρίς members. Μπορούμε μετά να προσθέτουμε ιδιότητες και μεθόδους στο ίδιο ή το prototype του. Αν προσθέτουμε στο ίδιο, τότε οι προσθήκες αφορούν μόνο αυτό το αντικείμενο και κανένα άλλο. Αν προσθέτουμε στο prototype, τότε όλα (μα όλα!) τα αντικείμενα αποκτούν τη νέα ιδιότητα ή μέθοδο:

Κώδικας: Επιλογή όλων

Object.prototype.magicNumber = 13
Τώρα όλα τα αντικείμενα που δημιουργήσαμε ή θα δημιουργήσουμε, όλα τα arrays, τα strings, όλα τα elements της σελίδας, το document, το window, τα πάντα έχουν την ΚΟΙΝΗ ιδιότητα magicNumber. Γενικά οι προσθήκες στο Object.prototype έχουν τη φήμη κακού προγραμματιστικού στυλ. Μπορούν να προκαλέσουν χαοτικές παρενέργιες σε άλλα μέρη του κώδικα, και σε άλλες script libraries που θα τρέχουν παράλληλα. Επιπλέον λόγω που είναι κοινές συνήθως δεν έχει νόημα να είναι ιδιότητες αλλά μόνο μέθοδοι, όπως στο παράδειγμα που έδωσες με την constructor function person. Αυτό είναι έγκυρο παράδειγμα γιατί οι κοινές μέθοδοι setAge και getAge περιορίζονται στα αντικείμενα που παράγονται από την συγκεκριμένη contructor function. Ωστόσο η πρώτη γραμμή του δεύτερου παραδείγματος είναι περιττή, αφού στη ουσία ακυρώνετε από τη δεύτερη γραμμή. Επιπλέον υπάρχει η σύσταση να έχουν PascalCase οι συγκεκριμένες μεταβλητές, για να ξεχωρίζουν οι constructor functions από τις κοινές functions. Person λοιπόν! :)

Όσο για τα arrays δεν είναι παρά αντικείμενα σχεδόν σαν όλα τα άλλα. Το σχεδόν πάει στην ιδιότητα length που είναι κάπως μαγική και δε μπορεί να προσομοιωθεί με standard κώδικα. Η length επιστρέφει συνήθως τον αριθμό των στοιχείων του array, αλλά στην πραγματικότητα απλά επιστρέφει τον μεγαλύτερο index συν ένα. Αδιαφορεί αν λείπουν ενδιάμεσοι δείκτες, ή αν προσθέσουμε στοιχεία με μη αριθμητικούς δείκτες:

Κώδικας: Επιλογή όλων

var a = []
a['one'] = 1
alert(a.length) // εμφανίζει 0
a[9] = 9
alert(a.length) // εμφανίζει 10
Αν χτίζουμε ένα μεμονωμένο αντικείμενο και δε μας ενδιαφέρει να φτιάξουμε αργότερα δεύτερο, τότε δεν υπάρχει λόγος να χρησιμοποιηθεί constructor function. Προσθέτουμε τα members επί τόπου. Αν μάλιστα ταιριάζει με την περίπτωση μπορούμε να ξεκινήσουμε από ένα Array αντί για απλό Object, ώστε να έχουμε στη διάθεσή μας τις μεθόδους push, pop κ.λπ.

Τα αντικείμενα είναι στανταρ χαρακτηριστικό της γλώσσας, οπότε παίζουν παντού. Η JavaScript γεννήθηκε εξαρχής Object based, σε αντίθεση με την PHP που έγινε στην πορεία. Μόνο πρόβλημα στην πράξη ο IE5 που δεν έχει μερικές ιδιότητες των Arrays, βασικά τις push, pop, shift και unshift. Για το λόγο αυτό συνήθως βλέπει κανείς τέτοιο κώδικα...

Κώδικας: Επιλογή όλων

a[a.length] = 10
... αντι για το πιο λογικό ...

Κώδικας: Επιλογή όλων

a.push(10)
Υπάρχει και άλλη λύση, να προστεθούν εκ των υστέρων αυτές οι μέθοδοι αν δεν υπάρχουν:

Κώδικας: Επιλογή όλων

if (!Array.prototype.push) Array.prototype.push = function(x) { this[this.length] = x }
Και πάλι όμως δε θεωρείται σωστό να πειράζει κανείς τα prototypes των build-in objects, αν και είναι μάλλον απίθανο να πάει κάτι στραβά.

Υπάρχει και το παρακάτω άρθρο, που αν κι έχει μια-δυο ανακρίβειες τα περισσότερα εξακολουθούν να ισχύουν. :)

- JavaScript για προχωρημένους: Objects
The pure and simple truth is rarely pure and never simple. Ο μη νους δε σκέπτεται μη σκέψεις για το τίποτα.

Απάντηση

Επιστροφή στο “JavaScript και Frameworks”

Μέλη σε σύνδεση

Μέλη σε αυτήν τη Δ. Συζήτηση: Δεν υπάρχουν εγγεγραμμένα μέλη και 0 επισκέπτες